正则表达式在完整字符串中查找可能包含空格,新行等的关键字

时间:2015-08-09 08:49:07

标签: regex

我想创建一个正则表达式,它将在完整的字符串中找到一个关键字(字符串可能包含空格,新行等)。

这是关键字email

的正则表达式
^([\n]*(.*))*[eE][^a-z]*[mM][^a-z]*[aA][^a-z]*[iI][^a-z]*[lL][^a-z]*([\n]*(.*))*$

email之后字母数较少,但email之后有大字符(超过10)时无法正常工作,效果很好。

请更正此表达式。

1 个答案:

答案 0 :(得分:2)

这是你的固定正则表达式:

^[\s\S]*[Ee][^a-z]*[Mm][^a-z]*[Aa][^a-z]*[Ii][^a-z]*[Ll][\s\S]*$

请参阅demo

请注意,您的正则表达式很快会导致catastrophic backtracking,您可以在regex101.com上轻松查看。您用来匹配关键字之前和之后的可选文本的模式([\n]*(.*))*非常低效,并且应该归咎于灾难性的回溯。

要匹配任何字符,您可以使用允许线性匹配的[\s\S]*模式,效率非常高。

如果您可以使用i ignorecase和s单行修饰符,则可以将正则表达式缩短为

^.*e[^a-z]*m[^a-z]*a[^a-z]*i[^a-z]*l.*$

请参阅demo

并提示:如果email应该是一个完整的单词,则需要将其括在单词边界\b中(以使其与emailing不匹配:

^.*\be[^a-z]*m[^a-z]*a[^a-z]*i[^a-z]*l\b.*$