可以测试正则表达式,看它是否减少到.*

use*_*788 10 regex reduce wildcard

我正在开发一个应用程序,用户输入正则表达式作为过滤条件,但我不希望人们(轻松)能够输入.*(即匹配任何东西).问题是,如果我只是使用if (expression == ".*"),那么通过输入诸如此类的东西可以很容易地回避这个问题.*.*.

有没有人知道一个可能需要一个正则表达式的测试,看看它是否基本上.*是一个稍微复杂的形式?

我的想法是:

  1. 我可以看到表达式是否是一个或多个重复.*,(即如果它匹配(\.\*)+(引用/转义可能不完全准确,但你得到了想法).这个问题是可能有其他形式的全局写匹配(例如with $^)太过于详尽,甚至没有考虑到前期,请进行测试.

  2. 我可以用它测试一些随机生成的字符串,并假设如果它们全部通过,则用户输入了全局匹配模式.这种方法的问题在于,可能存在表达式足够严密的情况,我只选择坏的字符串来匹配.

思绪,有人吗?

(仅供参考,该应用程序使用Java,但我想这更像是一个算法问题,而不是特定语言的问题.)

Ray*_*ger 8

是的,有一种方法.它涉及将正则表达式转换为规范的FSM表示.见http://en.wikipedia.org/wiki/Regular_expression#Deciding_equivalence_of_regular_expressions

您可能会找到为您工作的已发布代码.如果没有,详细步骤如下:http: //swtch.com/~rsc/regexp/regexp1.html

如果这似乎太多了,那么你可以使用快速而肮脏的概率测试.只生成一些随机字符串,看它们是否与用户的正则表达式匹配.如果它们匹配,你就可以很好地表明正则表达式过于宽泛.


ste*_*ema 1

有很多很多的可能性来实现相当于的东西.*。例如,只需将任何类别的字符和对应部分放入一个类别或一个替代中,它就会匹配任何内容。
因此,我认为使用正则表达式不可能测试另一个正则表达式是否与.*.

这些是一些匹配相同的示例.*(它们还将匹配换行符)

/[\s\S]*/
/(\w|\W)*/
/(a|[^a])*/
/(a|b|[^ab])*/
Run Code Online (Sandbox Code Playgroud)

所以我认为你的想法2会更容易实现。