2017-05-26 13 views
1

我想捕捉字符串中的字常量。该常量是:什么正则表达式可以在短语中捕获2个确切的'单词'?

  1. 一个字,接着一个分离器(空白,点,短划线或下划线)
  2. 另一字
  3. 然后隔板
  4. (参见#2)或结束线或字符串。

贪图例如假设我在寻找“鲍勃·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中)。

回答

1

我没有使用PHP,但我下面的比赛:

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

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

+0

我想补充,你需要检查“鲍勃”之前会发生什么,因为“鲍勃”可能我为什么包括在启动A \ B是一个字符串的一部分,因此。 –

+0

我不需要在我的例子中转义它,因为它是列表的最后一个字符。如果这不是引擎认为它是一个字符范围,你需要逃避它。 – AlexV

0

下面的现场演示中只有最后一行应该是一个匹配,并且不会被捕获。

为此你需要一个积极的前瞻。

正则表达式:Bob[\s._-]1(?=[\s._-])

  • (?=[\s._-])只会寻找有它的特殊性类,并且将不匹配/捕获它。

Regex101 Demo

0

在第二个列表中,我不知道如何在可能的字符中添加字符串的末尾。

你可以使用这个表达式锚$断言字符串的结尾:

/\bBob[\s._-]1(?:[\s._-]|$)/m 

或者如果你不希望下一个字符匹配后第2个字,然后用前瞻:

/\bBob[\s._-]1(?=[\s._-]|$)/m 

([\s._-]|$)将声明存在给定的(空格,DOT,下划线,连字符之一)字符或行尾$

它是安全Bob之前添加\b精确匹配字Bob和避免匹配HelloBob

RegEx Demo

相关问题