我想创建一个正则表达式,它将在完整的字符串中找到一个关键字(字符串可能包含空格,新行等)。
这是关键字email
^([\n]*(.*))*[eE][^a-z]*[mM][^a-z]*[aA][^a-z]*[iI][^a-z]*[lL][^a-z]*([\n]*(.*))*$
email
之后字母数较少,但email
之后有大字符(超过10)时无法正常工作,效果很好。
请更正此表达式。
答案 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.*$