Заимствуя решение Тима, но исправив его для обработки ASCII более 1970-х годов - помните, символы Java являются Unicode, поэтому вы должны учитывать это - дает следующее простое решение:
String new = old.replaceAll("(?x) (?<= \\pL ) (?= \\pN ) | (?<= \\pN ) (?= \\pL )", " ");
и это более поддерживаемоеи менее безумная версия:
String new = old.replaceAll(
"(?x) # enable comment mode \n"
+ " # LOOK FOR EITHER: \n"
+ " (?<= \\pL ) # a letter right behind \n"
+ " (?= \\pN ) # AND a number right ahead \n"
+ " | # OR ELSE \n"
+ " (?<= \\pN ) # a number right behind \n"
+ " (?= \\pL ) # AND a letter right ahead \n"
+ "", // placeholder so comma doesn't get lost
" "); // replaced with a single space
, которую, я думаю, вы могли бы написать так, чтобы не было слишком отступов:
String new = old.replaceAll(
"(?x) # enable comment mode \n"
+ " # LOOK FOR EITHER: \n"
+ " (?<= \\pL ) # a letter right behind \n"
+ " (?= \\pN ) # AND a number right ahead \n"
+ " | # OR ELSE \n"
+ " (?<= \\pN ) # a number right behind \n"
+ " (?= \\pL ) # AND a letter right ahead \n"
+ "", // placeholder so comma doesn't get lost
" "); // replaced with a single space
Это, вероятно, лучшее, что вы сможете сделатьделать, учитывая, как ужасно плохо подходит Java для такого рода работы.Если вы использовали только Java, вы, вероятно, даже не знаете, насколько это на самом деле противно.Здесь для сравнения показано, как выглядит та же самая операция на языке, который был разработан с учетом регулярных выражений:
($new = $old) =~ s{ # LOOK FOR EITHER:
(?<= \pL ) # a letter right behind
(?= \pN ) # AND a number right ahead
| # OR ELSE:
(?<= \pN ) # a number right behind
(?= \pL ) # AND a letter right ahead
}{ }xg; # THEN insert a single space
См. Все многие, многие критически важныеразличия?Просто ошеломляет, не так ли?
Я могу выполнять регулярные выражения в ассемблере, если я тоже хочу;на самом деле у меня есть.Это так же весело, как и на Java.Выполнение регулярных выражений в Java слишком похоже на обучение свиньи пению: это пустая трата вашего времени, и это раздражает свинью;это также раздражает всех остальных, включая вас.
Обучение правильному инструменту для правильной задачи - это то, что отличает профессионального программиста от обезьяны кода.Жизнь слишком коротка, чтобы биться головой о кирпичную стену.