我试图匹配一个没有附加前缀或后缀的单词的所有实例,基本上是任何以空格开头或出现在字符串开头的单词的实例之后是空格或标点符号。以下内容应匹配:
"This is the word."
"word is this."
以下不应该:
"This is preword."
"wordness is this."
我原来的解决方案是:
(^|\\s)word(\\s|,|\\.)
但是它没有捕获单词出现在字符串开头的情况。 我怎样才能正确使用克拉来做到这一点?
答案 0 :(得分:5)
您似乎在寻找word boundaries \b
。
您遇到的可能问题是像\sword\s
这样的正则表达式会消耗搜索词周围的空格,因此在当前匹配后,这些空格不会被重复用于查找下一个词。
实施例
foo foo foo foo foo
如果您想查找foo
,例如
所以正则表达式看起来像(^|\\s)foo(\\s|$)
你会匹配
foo foo foo foo foo
^^^^ ^^^^^ ^^^^
第二个foo
不会匹配,因为之前的空格已被第一个foo
的匹配使用,
foo foo foo foo foo
X^^^^ cant use space marked with `X`
所以下一个子串将是
foo foo foo foo foo
^^^^^
然后
foo foo foo foo foo
^^^^
要解决此问题,您可以使用\b
代表来自\w
(a-z
A-Z
0-9
和_
)的字符之间的位置任何不在\w
中的字符。
所以请尝试使用\bword\b
(在Java String中需要将其编写为"\\bword\\b"
)
顺便说一下,如果quotation \Q...\E
包含正则表达式special characters,则可能应该围绕您的单词。
所以你的正则表达式看起来像"\\b\\Qword\\E\\b"
。
答案 1 :(得分:2)