在制表符分隔的文本文件中,我只想匹配第 24 个制表符之后包含“1”值的行。
现在,我的正则表达式似乎与我想要的匹配,但当行不匹配时中断。
你能帮我改进一下吗?
我的正则表达式:
/(?:.+?\t){24}1/
示例输入:
INT E_63 0 0 u Le Le DET:ART DET le ?? ADJ SENT DET:ART NOM ADV SENT DET NOM 1 ?? ?? ?? ?? ?? 0 0 0 0 0 1 ?? ?? ?? ?? ?? ??
INT E_63 0 0 u Le Le DET:ART DET le ?? ADJ SENT DET:ART NOM ADV SENT DET NOM 1 ?? ?? ?? ?? ?? 0 0 0 0 0 0 ?? ?? ?? ?? ?? ??
(第一行应该匹配,第二行不匹配。)
最佳答案
当由于 catastrophic backtracking 而没有匹配项时,您的正则表达式将不起作用。作为 .
也匹配制表符。再加上嵌套量词组后有更多子模式,并且缺少 ^
anchor ,灾难性的回溯迫在眉睫。
你需要的是一个否定字符类 [^\t]
并将模式锚定在字符串的开头:
/^(?:[^\t]*\t){24}1/
参见 regex demo .
注意:要将 1
匹配为整个单词,您可以考虑在其后添加 \b
,或者先行 (?!\S)
.
详细信息:
^
- 字符串的开始(?:[^\t]*\t){24}
- 24 个序列[^\t]*
- 制表符以外的 0+ 个字符\t
- 制表符
1
-1
字符。
关于一定数量的标签后的正则表达式匹配特定值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40082232/