正则表达式匹配包含n个或更多指定字符的文本

时间:2013-01-22 17:26:11

标签: regex

我需要查找包含超过10个“,”的行(我导入CSV时出错,所以我需要手动更正)。 我正在使用Notepad ++,所以我不需要写reqex来匹配行,只是为了匹配comas。

(.*,.*){11,100}   //does not work

2 个答案:

答案 0 :(得分:16)

.*也匹配逗号。您需要排除具有否定字符类的字符([^,]匹配除逗号之外的任何字符):

^[^,\r\n]*(?:,[^,\r\n]*){11,}$

我已将\r\n添加到字符类中,或者它会在换行符中匹配。

请注意,这也会计算引用字符串中包含的逗号,因此如果您有逗号,则会错误判断CSV行中的字段数。

答案 1 :(得分:4)

假设Notepad ++版本6+(使用PCRE Perl兼容正则表达式库)并且“ 匹配换行符”框未在“查找”窗口中勾选:

(.*?,){11,}

如果一行包含10个以上的逗号,则该行将从该行的开头到最后一个逗号匹配。

(.*?,)匹配除换行符之外的任何字符,尽可能少,直到下一个字符为逗号; {11,}表示11次或更多次。

如果您希望正则表达式工作,无论“ 匹配换行符”框是否勾选,您都可以使用:

 ([^\n]*?,){11,}

如果未勾选“ 匹配换行符”框,您的正则表达式可以正常工作,但是因为它匹配任何字符贪婪,如此大量的潜在匹配可能会使应用程序挂起。在?之后添加.*,以便通配符 lazily 不情愿地,即尽可能少地匹配问题。

PCRE man pages
Perl Regular Expressions documentation - 推荐。
Notepad++ "outdated" regular expressions tutorial