用“或”安全字母串联多个正则表达式?

时间:2009-09-28 16:10:03

标签: regex

我们有一个配置文件,列出了一系列正则表达式,用于排除我们正在构建的工具的文件(它扫描.class文件)。开发人员使用OR“|”将所有单个正则表达式附加到单个正则表达式中像这样的运算符:

RX1 | RX2 | RX3 | RX4

我的直觉反应是会有一个表达方式会搞砸了,并给我们错误的答案。他声称没有;他们是ORed在一起。我无法提出要解决这个问题的案例,但仍然对执行情况感到不安。

这样做安全吗?

6 个答案:

答案 0 :(得分:3)

它不仅安全,而且可能比单独的正则表达式匹配产生better performance

采用单个正则表达式模式并测试它们。如果它们按预期工作,那么将它们组合在一起,每个仍然会匹配。因此,您使用一个正则表达式而不是必须单独匹配的多个正则表达式模式来增加覆盖率。

答案 1 :(得分:2)

只要它们是有效的正则表达式,它应该是安全的。未闭合的括号,括号,括号等将是一个问题。您可以尝试解析每个部分,然后将其添加到主正则表达式以验证它们是否完整。

此外,某些引擎具有可以在表达式中切换正则表达式标志的转义(例如区分大小写)。我没有足够的经验说这是否会延续到OR的第二部分。作为一个状态机,我认为它不会。

答案 2 :(得分:1)

它与正则表达式中的任何其他内容一样安全!

答案 3 :(得分:0)

就正则表达式而言,Google code search为搜索提供了正则表达式,因此......可以拥有安全的正则表达式

答案 4 :(得分:0)

我也没有看到任何可能的问题。

我想通过说'安全'你的意思是它会根据你的需要匹配(因为我从来没有听说过RegEx安全漏洞)。安全与否,我们无法从中得知。您需要向我们提供更多详细信息,例如完整的正则表达式。你用组包装并允许多个吗?你用开始和结束锚包裹它吗?

如果要匹配几个类文件名,请确保使用开始和结束锚点以确保匹配从开始直到结束。像这样的“^(file1|file2)\.class$”。如果没有开始和结束锚点,您最终可能会匹配“my_file1.class

答案 5 :(得分:0)

答案是,这是安全的,这是安全的原因是'|'在正则表达式中具有最低优先级。

那是:

regexpa|regexpb|regexpc

相当于

(regexpa)|(regexpb)|(regexpc)

明显的例外是第二个会以位置匹配结束而第一个不会,但是两个匹配完全相同的输入。或者换句话说,使用Java术语:

String.matches("regexpa|regexpb|regexpc");

相当于

String.matches("regexpa") | String.matches("regexpb") | String.matches("regexpc");