我已经在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
。
有没有什么方法可以让这个正则表达式替换工作,而不必将它们分成多个单独的正则表达式,并尝试重复替换一个字符串?
答案 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
(下划线替换此处的空格,以使解释更清晰):
the_
,剩余字符串:cat_in_the_hat
_in_
,剩余字符串:the_hat
the
不匹配,因为它既不是空格也不是(原始)字符串的开头。您可以使用lookarounds代替,因为它们的行为类似于条件(即if
):
(?<=^| )(?:the|and|at|in|or|on|off|all|beside|under|over|next)(?= |$)
通过这种方式,您可以:
the
,剩余字符串:_cat_in_the_hat
in
,剩余字符串:_the_hat
the
,剩余字符串:_hat
但是@JonathanMee answer是最好的解决方案,因为为此目的正确地实施了字边界;)