正则表达式匹配所有具有特定数量或更少分隔符的行

RegEx to match all lines that have a specific quantity of delimiters or less

我正在寻找一个正则表达式来匹配所有具有特定数量或更少分隔符的行。

例如,我有一个以 - 作为分隔符的大文件

IWant-id-name-email-tel
this-919-yoda-yoda@republic.com-+10107327863876
this-350-mando-mando@fuckeverything.com-null
this-838-vader-vaderules@empire.com-+83389389083
oops-111-c-3po-c3po@nopenis.tatooine-+190012904829

如您所见,条目 111 已被过多的 ----
损坏 而且我不知道那里可以有多少个破折号:
oops-111-c-3po-more-many-dashes-c3po@nopenis.tatooine-+190012904829

/^(.*?-){4,}.*$/ - 我可以匹配超出的行。

/^(.*?-){,4}.*$/ - 但我无法将其反转以匹配带有少量分隔符的整行。

/^(.*?-){4}[^-]+$/ - 它也没有指定确切的数量,因为要匹配整行,它也会匹配不正确的。

有必要将损坏的行留在某些大文件编辑器中以将其导出以供分析。
就是这样

使用 .* 也可以匹配 -{4,} 将匹配 4 次或更多次。

在你的最后一个模式中 ^(.*?-){4}[^-]+$ 你恰好匹配了 4 次重复。


您可以使用量词 1-4 来匹配破折号的 1 到 4 次。

使用 [^\n-]* 将匹配除 - 之外的任何字符,字符 class 中的 \n 不会交叉匹配换行符。

^(?:[^\n-]*-){1,4}[^\n-]*$

Regex demo

要匹配 4 - 或更少的行,请尝试

/^([^-]*-){0,4}[^-]*$/

这假定 ^$ 匹配行的开头和结尾,而不是字符串的开头和结尾。根据您的正则表达式引擎,您可能必须先启用此模式。

另一种方法是使用否定前瞻来拒绝至少有五个 - 的行:

^(?!(?:.*\-){5}).*

调用 多行 选项导致 ^$ 匹配行的开头和结尾。

In action!