【发布时间】:2021-03-08 13:36:53
【问题描述】:
我正在寻找正确的正则表达式来查找少于 n 倍 TAB (\t) 字符的行。
我试过这个,但什么也没找到:
^.*(?:\t.*){0,20}\r\n
【问题讨论】:
-
你试过
^(?.*:\t.*){0,20}\r\n或^(?:.*\t)*\r\n
我正在寻找正确的正则表达式来查找少于 n 倍 TAB (\t) 字符的行。
我试过这个,但什么也没找到:
^.*(?:\t.*){0,20}\r\n
【问题讨论】:
^(?.*:\t.*){0,20}\r\n或^(?:.*\t)*\r\n
您的模式在开头包含.*(在^ 之后,字符串/行锚的开头),并且它尽可能匹配除换行符之外的任何零个或多个字符。因此,它可以匹配任意数量的选项卡。然后,(?:\t.*){0,20} 匹配零个、一...二十个选项卡,然后尽可能多地匹配除换行符之外的任何零个或多个字符。
最后,正则表达式根本不限制一行中制表符的数量。
要匹配您需要的标签数量不超过 N 数量的行
^(?!(?:[^\t\r\n]*\t){N+1}).*
N 是您的出现次数。因此,如果您想匹配(然后删除,因为您在正则表达式末尾有 \r\n)不超过 20 个制表符的行,您可以使用
^(?!(?:[^\t\r\n]*\t){21}).*\R?
请参阅regex demo。
详情:
^ - 字符串/行的开始(?!(?:[^\t\r\n]*\t){21}) - 如果出现 21 个零个或多个字符(除 CR、LF 和 TAB 后跟紧跟当前位置右侧的 TAB 字符),则匹配失败.* - 该行的其余部分\R? - 可选的换行序列(CRLF、LF 或 CR)。【讨论】: