一定数量的标签后的正则表达式匹配特定值

标签 regex perl

在制表符分隔的文本文件中,我只想匹配第 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/

相关文章:

java - Unicode 字符 ""有什么特别之处,以至于它破坏了基于大括号的解析器逻辑?

arrays - Perl - 如何从分隔的 txt 文件中读取每一行并处理它

closures - 如何使用嵌套闭包作为 List::Util::reduce 的第一个参数?

仅用于整个单词的 PHP 正则表达式

javascript - 更改 javascript 中输入的匹配文本的文本颜色

Perl 脚本找不到 Net/SSH/Perl.pm

perl - 在 Perl 中制作数据结构的深拷贝的最佳方法是什么?

ruby - 如何去除不是单词字符的所有字符的 Ruby 字符串?

PHP从字符串中提取数字 block 时如何避免混合字母数字

python - 组中有行尾的正则表达式