我正在尝试在字符串中捕获单词常量。那个常数是:
为了这个例子,让我说我正在寻找“Bob 1”,在以下字符串中:
Hello, I'm Bob 1 --> Should capture Bob 1
Hello, I'm Bob 11 --> Should capture nothing (Bob 1 is not at the end or followed by a separator)
Hey, it's Bob-1 over there --> Should capture Bob-1
Hey, it's Bob - 1 over there --> Should capture nothing (Bob should be followed only by one separator not 3 like here)
Bob.1 --> Should capture Bob.1
Bob_1 rules! --> Should capture Bob_1
我有一个主要有效的正则表达式:
/Bob[\s._-]1[\s._-]/ig
在第二个列表中,我不知道如何在可能的字符中添加字符串的结尾...这只在下面的现场演示的最后一行结束,应该是一个匹配而且没有被捕获
请参阅live demo。
我使用pcre(在PHP中)。
答案 0 :(得分:1)
我没有使用PHP,但以下是我的匹配:
\bBob[\s.\-_]1\b
它正在利用与词边界匹配的\b
。我发现我不得不逃避方括号内的破折号,这不是你正在做的事情,但这可能是我们正在使用的正则表达式引擎之间的差异。
答案 1 :(得分:1)
这有效
https://regex101.com/r/ezikuP/2
(?<!\S)Bob[\s._-]1(?![^\s._-])
(?<! \S ) # Whitespace boundary
Bob # Word 1
[\s._-] # Special seperator
1 # Word 2
(?! [^\s._-] ) # Special seperator boundary
答案 2 :(得分:0)
仅在下面的现场演示的最后一行结束时应该匹配并且不会被捕获。
为此,你需要一个积极的前瞻。
正则表达式: Bob[\s._-]1(?=[\s._-])
(?=[\s._-])
只会查找给予字符类并且不会匹配/捕获它。<强> Regex101 Demo 强>
答案 3 :(得分:0)
在第二个列表中,我不知道如何在可能的字符中添加字符串的结尾。
您可以将此正则表达式与锚$
一起使用来断言字符串结尾:
/\bBob[\s._-]1(?:[\s._-]|$)/m
如果您不希望在第二个单词之后匹配下一个字符,请使用前瞻:
/\bBob[\s._-]1(?=[\s._-]|$)/m
([\s._-]|$)
将断言给定(空格,DOT,下划线,连字符之一)字符或行尾$
的存在。
在\b
之前添加Bob
以匹配确切的字词Bob
并避免匹配HelloBob