我需要一个正则表达式,它会抓住排除n
和The
的字词中的前A
个字符。
例如,这是我的样本数据集:
The firstMatch
A SecondMatch
the thirdMatch
a Fourthmatch
以下是我尝试的正则表达式:"^(.{3}).*$
抓取每个输入字符串的前三个字符。但我真正想要的是每个输入字符串不的前三个字符,包括A
或The
因此,对于上面的输入字符串,我想要的匹配是:
'fir', 'Sec, 'thi', 'Fou'
关于如何做到这一点的任何想法?
答案 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组,确保使用多行,全局和不敏感的修饰符
下次我建议您指定正在使用的正则表达式编译器