正则表达式排除某些单词

时间:2014-07-07 22:34:44

标签: ruby regex regex-negation

我需要一个正则表达式,它会抓住排除nThe的字词中的前A个字符。

例如,这是我的样本数据集:

The firstMatch
A SecondMatch
the thirdMatch
a Fourthmatch

以下是我尝试的正则表达式:"^(.{3}).*$

抓取每个输入字符串的前三个字符。但我真正想要的是每个输入字符串的前三个字符,包括AThe

因此,对于上面的输入字符串,我想要的匹配是:

'fir', 'Sec, 'thi', 'Fou'

关于如何做到这一点的任何想法?

3 个答案:

答案 0 :(得分:4)

这取决于您使用的是哪种正则表达式引擎(最初问题未被标记为Ruby,因此我将保留其他选项。)

选项1:Lookbehind(C#,PHP,Java)

(?im)(?<=^The |^a )\w{3}

请参阅demo

许多引擎支持lookbehind,但支持可变宽度的后端并不多。

选项2:\K(PHP,Perl,Ruby 2 +)

(?im)^(?:The |a )\K\w{3}

请参阅demo

\K告诉引擎放弃与其返回的最终匹配相匹配的内容

选项3:捕获组(JavaScript,Python,其他)

(?im)^(?:The |a )(\w{3})

the demo中,查看右侧窗格中的第1组捕获。

括号将匹配捕获到第1组。我们从第1组中检索它。

<强>解释

  • (?i)启用不区分大小写的行
  • (?m)启用了多行模式,允许^$在每一行匹配
  • ^锚点断言我们位于字符串的开头
  • (?<=^The |^a )是一个lookbehind,断言当前位置之前的是字符串的开头The,或者字符串的开头然后是a
  • (?:The |a )是一个非捕获组,其中包含OR |更改
  • (\w{3})中的括号将匹配捕获到第1组。

<强>参考

答案 1 :(得分:3)

使用此:

^(?:(?:the|a)\s+)?(.{3})

使用不区分大小写的搜索。

原始正则表达式中的.*$部分毫无意义。

答案 2 :(得分:1)

你可以做这样的事情

^(the|A)? *(.{3}).+$

捕捉第2组,确保使用多行,全局和不敏感的修饰符

下次我建议您指定正在使用的正则表达式编译器