Использование регулярных выражений Java API для вставки слов - PullRequest
2 голосов
/ 06 июля 2011

Я новичок в регулярных выражениях и java, поэтому, пожалуйста, ответьте на мой вопрос для новичков.

Я хочу сделать следующее:

Если у меня есть строка:

"I like ice cream only if it is chocolate ice cream. Chocolate cream" 

и шаблон типа

"chocolate ice cream" 

Я хочу сопоставить и заменить все слова, совпадающие с #, окружающими их.Вот так:

"I like #ice cream# only if it is #chocolate ice cream#. #Cholcolate cream#"

Я использовал регулярное выражение Java Java, и я понимаю, что я могу использовать Matcher.replaceAll.Но я не могу придумать правильное регулярное выражение.Я придумал это chocolate*\\s*ice*\\s*cream*.Но проблема здесь в том, что он соответствует только всей подстроке, то есть "chocolate ice cream".Я думаю, что-то вроде этого может работать:

chocolate|ice|cream|chocolate ice|ice cream|chocolate cream|chocolate ice cream

и т. Д., Т.е. все перестановки, но это будет громоздко по мере роста подстроки.

Буду признателен за любые идеи о правильном направлении.

Ответы [ 4 ]

7 голосов
/ 06 июля 2011

Используйте шаблон:

(?i)\b((?:chocolate|ice|cream)(?:\s+(?:chocolate|ice|cream))*)\b

и замените его на:

#$1#

Демонстрация:

String s = "I like ice cream only if it is chocolate ice cream. Chocolate cream";
s = s.replaceAll("(?i)\\b((?:chocolate|ice|cream)(?:\\s+(?:chocolate|ice|cream))*)\\b", "#$1#");
System.out.println(s);

Границы слова вызывают «сливочный» (идругие подобные слова) не для замены.

Обратите внимание, что это изменит "ice ice" на "#ice ice#" (то есть слова могут встречаться более одного раза!), как упомянуто @stemaв комментариях.

3 голосов
/ 06 июля 2011
(?:chocolate|ice|cream)(?:\s+(?:chocolate|ice|cream))*

Это будет соответствовать одному или нескольким указанным словам, разделенным пробелом

0 голосов
/ 06 июля 2011

Может быть, вы найдете интересный MessageFormat из Java API

Object[] testArgs = {new Long(3), "MyDisk"};

MessageFormat form = new MessageFormat(
  "The disk \"{1}\" contains {0} file(s).");

 System.out.println(form.format(testArgs));

 // output, with different testArgs
 output: The disk "MyDisk" contains 0 file(s).
 output: The disk "MyDisk" contains 1 file(s).
 output: The disk "MyDisk" contains 1,273 file(s).
0 голосов
/ 06 июля 2011

Попробуйте это:

final String source = "I like ice cream only if it is chocolate ice cream. Chocolate cream";
final String result = source.replaceAll("((?:[Cc]hocolate )?(?:[Ii]ce )?cream)", "#$1#");

// Prints I like #ice cream# only if it is #chocolate ice cream#. #Chocolate cream#
System.out.println(result);

См. Дополнительные элементы для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...