7

我想匹配仅包含已定义字符的整个单词(或真正的字符串)。

例如,如果字母是d, o, g:

dog = match
god = match
ogd = match
dogs = no match (because the string also has an "s" which is not defined)
gods = no match
doog = match
gd = match

在这句话中:

dog god ogd, dogs o

...我希望匹配dog, god, and o(不是ogd,因为逗号或dogs由于s

4

4 回答 4

15

这应该适合你

\b[dog]+\b(?![,])

解释

r"""
\b        # Assert position at a word boundary
[dog]     # Match a single character present in the list “dog”
   +         # Between one and unlimited times, as many times as possible, giving back as needed (greedy)
\b        # Assert position at a word boundary
(?!       # Assert that it is impossible to match the regex below starting at this position (negative lookahead)
   [,]       # Match the character “,”
)
"""
于 2012-05-23T03:56:38.617 回答
5

以下正则表达式表示您要查找的三个字符出现一次或多次:

[dog]+

解释:

方括号的意思是:“任何封闭的字符”。

加号表示:“前一个表达式出现一次或多次

这将是完全相同的事情:

[ogd]+
于 2012-05-23T03:52:58.173 回答
3

您使用的是哪种正则表达式风格/工具?(例如 JavaScript、.NET、Notepad++ 等)如果它支持前瞻和后瞻,您可以这样做:

(?<!\S)[dog]+(?!\S)

这样,您将只能获得位于字符串开头或前面有空格、或位于字符串末尾或后面有空格的匹配项。如果您不能使用lookbehind(例如,如果您使用JavaScript),您可以拼出前导条件:

(?:^|\s)([dog]+)(?!\S)

在这种情况下,您将从组 #1 中检索匹配的单词。但是不要采取下一步并尝试将前瞻替换为(?:$|\s). 如果你这样做了,第一个命中(“dog”)将消耗尾随空格,并且正则表达式将无法使用它来匹配下一个单词(“god”)。

于 2012-05-23T04:41:29.570 回答
2

根据语言,这应该做你需要做的事情。它只会与您上面所说的相符;

这个正则表达式:

[dog]+(?![\w,])

在一串..

dog god ogd, dogs o

只会匹配..

dog, god, and o

javascript 中的示例

php中的示例

两个[](括号)之间的任何内容都是一个字符类。它将匹配括号之间的任何字符。您也可以使用范围.. [0-9][a-z]等,但它只会匹配 1 个字符。+and*是量词。搜索+1 个或多个字符,而*搜索 0 个或多个字符。您可以使用大括号 ( {}) 指定明确的字符范围,在其间放置一个数字或多个数字:{2}将仅匹配 2 个字符,而{1,3}将匹配 1 或 3。

括号之间的任何内容()都可用于回调,例如您想要返回或使用返回的值作为字符串中的替换。这 ?!是负前瞻,它不会匹配后面的字符类,以确保字符存在时匹配带有字符的字符串。

于 2012-05-23T03:53:28.890 回答