使用java';s regex api插入单词be

使用java';s regex api插入单词be,java,regex,Java,Regex,我不熟悉正则表达式和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

我不熟悉正则表达式和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的正则表达式api,我知道我可以使用
Matcher.replaceAll
。但我想不出一个合适的正则表达式。我想出了这个
巧克力*\\s*冰*\\s*奶油*
。但这里的问题是它只匹配整个子字符串,即
“巧克力冰淇淋”
。我认为这样的方法可以奏效:

chocolate|ice|cream|chocolate ice|ice cream|chocolate cream|chocolate ice cream
等等,即所有置换,但随着子串的增长,这将变得很麻烦

如果有任何关于朝着正确方向前进的想法,我将不胜感激

(?:chocolate|ice|cream)(?:\s+(?:chocolate|ice|cream))*
这将匹配一个或多个由空格分隔的指定单词,请尝试以下操作:

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);
有关更多信息,请参阅。

使用以下模式:

(?i)\b((?:chocolate|ice|cream)(?:\s+(?:chocolate|ice|cream))*)\b
并将其替换为:

#$1#
演示:

单词边界导致“creamy”(以及其他类似的单词)不能被替换


请注意,这将把
“ice ice”
更改为
“#ice#”
(即,单词可以出现多次!),正如@stema在注释中提到的那样。

也许您会从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).

秩序重要吗?您希望
冰巧克力
匹配吗?并可能使其不区分大小写,以获得问题
(?i:chocolate | ice | cream)(?i:\\s+(?:chocolate | ice | cream))*
中提到的精确输出。
注意
冰激凌
现在将更改为:
“#冰激凌|y”
。也许这就是OP想要的,但也许不是。@Bart-true,+1是你抓住这个问题的解决方案:-)如果可以匹配像
奶油冰淇淋这样的东西,那就很好了
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).