正则表达式可以捕获短语中的2个确切“单词”?

时间:2017-05-26 14:59:52

标签: regex pcre

我正在尝试在字符串中捕获单词常量。那个常数是:

  1. 一句话
  2. 后跟一个分隔符(空格,点,短划线或下划线)
  3. 另一个字
  4. 然后是分隔符(请参阅#2)或行或字符串的结尾。
  5. 为了这个例子,让我说我正在寻找“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中)。

4 个答案:

答案 0 :(得分:1)

我没有使用PHP,但以下是我的匹配:

\bBob[\s.\-_]1\b

它正在利用与词边界匹配的\b。我发现我不得不逃避方括号内的破折号,这不是你正在做的事情,但这可能是我们正在使用的正则表达式引擎之间的差异。

答案 1 :(得分:1)

这有效

https://regex101.com/r/ezikuP/2

(?<!\S)Bob[\s._-]1(?![^\s._-])

Formatted

 (?<! \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

更安全

RegEx Demo