正则表达式的正则表达式?

可能重复:
是否有正则表达式来检测有效的正则表达式?
寻找正则表达式的正则表达式?

我有一个应用程序,使用户可以输入正则表达式。 我如何检查任何正则表达式的输入并确保它们是有效的,因为如果它们不在那里会出现preg_match错误?

我不想在preg_match之前使用'@',所以如果有办法检查正则表达式的用户输入的有效性,那将是非常好的。

PHP的正则表达式系统似乎太复杂了,我不能为它们提供一个正则表达式。


如果发生错误, preg_match()返回FALSE

  • 将表达式发送到服务器
  • preg_match在空字符串上
  • 看看是否有错误发生
  • 您可以使用Ajax来实时验证,或者在表单提交后验证。
    您也可以尝试通过将表达式提供给javascript regexp引擎进行验证,但js regexp语法与php之一不是100%兼容。


    在数学上,使用正则表达式验证正则表达式是不可能的。 这是因为(正式)正则表达式只能识别常规语言。 一种语言是任何一组字符串。 例如,所有十进制数的集合都是一种语言(顺便说一句,可以用正则表达式来描述); 所有有效正则表达式的集合也是一种语言。 常规语言是只需要固定的有限存储器(不是输入大小的函数)就可以识别的语言。

    包含所有有效正则表达式的语言不是常规语言; 因此使用正则表达式来识别正则表达式是不可能的。

    要理解这一点,请注意,正则表达式在其中包含必须匹配的括号。 因此,如果发生“(”,那么稍后必须发生“)”。 用只有固定有限内存的机器来描述这是不可能的。 因为,如果有办法做到这一点,并且你的正则表达式有K个不同状态的有限记忆(对于某个整数K),一个表达式的K个开括号后面跟着K个左括号,尽管有效的正则表达式应该是不能被该机器识别 - 一个矛盾(注意在正式语言中,我们的假设是文本处理一次发生一个字符,从左到右,这与应用的正则表达式是相同的)。 我们称之为描述正则表达式的语言如上下文无关和不规则的语言。

    (使用Pumping引理证明正则表达式不会形成正规语言是微不足道的)

    所以,在使用正则表达式来识别正则表达式时,存在一个基本的计算机科学问题: 在数学上不可能这样做。

    常规语言可能被有限状态自动机识别,即具有有限状态但没有记忆的机器。 为了克服你的问题,你需要添加一些依赖于输入大小的内存。 正则表达式,因为它们是上下文无关的(幸运的是它们不是一些模糊,难以识别的语言类型)可以使用下推自动机以线性时间来识别。 这是一个“for”循环,一次只能表达一个标记(通常是一个字符),并跟踪它在堆栈上的显示内容,即它“推送”它在先入内容中“弹出”的数据最新的时尚。 (推送到堆栈的数据示例:“我需要记住稍后找到匹配的')'! 您可以根据需要多次“推”这些; 你可以稍后“弹出”它,当你需要检查你是否真的需要先前匹配左括号时)。

    当然,为正则表达式编写自己的识别引擎会带来一些开销 - 但如果你想这样做,你应该知道上述限制。 使用现有的机制来做到这一点会更明智 - 我怀疑你可以将这项工作交给一个正则表达式库或一种更热衷于处理正则表达式(比如Perl)的语言; 但@方法不会听起来像一个想法太糟糕了:它可能会很慢,但您的用户可能会输入非常慢的正则表达式; 这可能是一个不好的做法,但在你的情况下,它似乎是最好的解决方案。

    维基百科中的一些相关文章:

  • 维基百科:Regular_language
  • 维基百科:Deterministic_finite_state_machine
  • 维基百科:Regular_expression#Formal_language_theory
  • 维基百科:Push-down_automaton
  • Wikipedia:Context-free_language
  • 维基百科:Pumping_lemma_for_regular_languages
  • 维基百科:LIFO
  • 我希望这有助于!


    让用户提交正则表达式几乎肯定是一个糟糕的想法。

    有些表达式非常昂贵。 尝试这个:

    preg_match('/(.*){1,32000}[bc]/','aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')
    

    这只是30个字符的输入! 它们并不都是这样的: /^(?:(d+)|::)*$/也是PCRE中的指数时间。

    链接地址: http://www.djcxy.com/p/76741.html

    上一篇: Regular expression for regular expressions?

    下一篇: How can I validate regex?