Java正则表达式取代所有不替换所有单词

时间:2015-04-16 14:35:41

标签: java regex

我已经在Java中使用这个正则表达多年了,无法让它工作:

(?:^| )(?:the|and|at|in|or|on|off|all|beside|under|over|next)(?: |$)

以下内容:

pattern.matcher("the cat in the hat").replaceAll(" ")

给了我cat the hat。另一个示例输入是the cat in of the next hat,它给了我cat of next hat

有没有什么方法可以让这个正则表达式替换工作,而不必将它们分成多个单独的正则表达式,并尝试重复替换一个字符串?

2 个答案:

答案 0 :(得分:10)

是的,您可以非常轻松地执行此操作,只需要使用boundaries,这是您尝试描述的内容:(?:^| )只需执行此操作:

\b(?:the|and|at|in|or|on|off|all|beside|under|over|next)\b

你原来没有捕获,但正如评论中提到的,如果你想捕获选项,你可以使用捕获而不是非捕获组:

\b(the|and|at|in|or|on|off|all|beside|under|over|next)\b

答案 1 :(得分:5)

你的问题是,匹配中包含前导和尾随空格,并且在两个匹配项中找不到char。

使用输入the_cat_in_the_hat(下划线替换此处的空格,以使解释更清晰):

  1. 第一场比赛:the_,剩余字符串:cat_in_the_hat
  2. 第二场比赛:_in_,剩余字符串:the_hat
  3. the不匹配,因为它既不是空格也不是(原始)字符串的开头。
  4. 您可以使用lookarounds代替,因为它们的行为类似于条件(即if):

    (?<=^| )(?:the|and|at|in|or|on|off|all|beside|under|over|next)(?= |$)
    

    Regular expression visualization

    Debuggex Demo

    通过这种方式,您可以:

    1. 第一场比赛:the,剩余字符串:_cat_in_the_hat
    2. 第二场比赛:in,剩余字符串:_the_hat
    3. 第三场比赛:the,剩余字符串:_hat
    4. 但是@JonathanMee answer是最好的解决方案,因为为此目的正确地实施了字边界;)