正则表达式查询有效吗?

时间:2015-01-21 15:35:26

标签: regex

我想出了下面的正则表达式来查找密码,密码,Pass001等术语以及它后面的单词。它有效还是可以做得更好?谢谢你的帮助

"([Pp][aA][sS][Ss]([wW][oO][rR][dD][sS]?|[Pp][hH][rR][aA][sS][eE])?|[Pp]([aA][sS]([sS])?)?[wW][Dd])[0-9]?[0-9]?[0-9]?[\s\:\-\=\_\/\@\&\'\[\(\+\*\r\n\)\]]+\S*"

我将使用它扫描高达300K的文件以获取这些条款。当我现在尝试使用这些表达式扫描整个C:驱动器需要5小时或更糟的情况我遇到过,5天

1 个答案:

答案 0 :(得分:1)

您可以使用以下增强功能:

(?i)p(?:ass(?:words?|phrase)?|(?:ass?)?wd)[0-9]{0,3}[-\s:=_\/@&'\]\[()+*\r\n]\S*

请参见regex demo

您可以通过添加[sS]不区分大小写修饰符来使regex不区分大小写,而不是(?i)。如果无法正常运行,请在软件中使用相应的选项。

请确保您的替换在字符串中的相同位置不匹配。这不是一件容易的事,但是p在第一组中每个替代项的开头都会降低正则表达式的效率。因此,将其移到外部(例如(?:pass|port) => p(ass|ort))。

如果您不打算访问子匹配项,请使用非捕获组而不是捕获组,这也会对性能产生轻微影响。

使用限制量词而不是重复?量化模式。代替a?a?a?,使用a{0,3}

请勿在字符类中过度转义字符。我只留下了\/\]\[,因为我不确定您使用的是哪种正则表达式,可能看起来完全可以避免转义。

请注意,如果连续的非固定宽度模式可能与相同类型的字符匹配,则性能损失会很大。您有[\s\:\-\=\_\/\@\&\'\[\(\+\*\r\n\)\]]+\S*[\s\:\-\=\_\/\@\&\'\[\(\+\*\r\n\)\]]+匹配1个或多个特殊字符,而\S*匹配0个或多个除空格以外的字符,空格也与前面模式匹配的某些字符匹配。从前面的子模式中删除+