是否有正则表达式来检测有效的正则表达式?

是否有可能使用另一个正则表达式检测有效的正则表达式? 如果是这样,请给下面的例子代码。


/
^                                             # start of string
(                                             # first group start
  (?:
    (?:[^?+*{}()[]|]+                      # literals and ^, $
     | .                                    # escaped characters
     | [ (?: ^?. | ^[^] | [^^] )     # character classes
          (?: [^]]+ | . )* ]
     | ( (?:?[:=!]|?<[=!]|?>)? (?1)?? )  # parenthesis, with recursive content
     | (? (?:R|[+-]?d+) )                 # recursive matching
     )
    (?: (?:[?+*]|{d+(?:,d*)?}) [?+]? )?   # quantifiers
  | |                                        # alternative
  )*                                          # repeat content
)                                             # end first group
$                                             # end of string
/

这是一个递归正则表达式,并且不被许多正则表达式引擎支持。 基于PCRE的应该支持它。

没有空白和评论:

/^((?:(?:[^?+*{}()[]|]+|.|[(?:^?.|^[^]|[^^])(?:[^]]+|.)*]|((?:?[:=!]|?<[=!]|?>)?(?1)??)|(?(?:R|[+-]?d+)))(?:(?:[?+*]|{d+(?:,d*)?})[?+]?)?||)*)$/

.NET不直接支持递归。 ( (?1)(?R)构造)。递归必须转换为计算平衡组:

^                                         # start of string
(?:
  (?: [^?+*{}()[]|]+                   # literals and ^, $
   | .                                  # escaped characters
   | [ (?: ^?. | ^[^] | [^^] )   # character classes
        (?: [^]]+ | . )* ]
   | ( (?:?[:=!]
         | ?<[=!]
         | ?>
         | ?<[^Wd]w*>
         | ?'[^Wd]w*'
         )?                               # opening of group
     (?<N>)                               #   increment counter
   | )                                   # closing of group
     (?<-N>)                              #   decrement counter
   )
  (?: (?:[?+*]|{d+(?:,d*)?}) [?+]? )? # quantifiers
| |                                      # alternative
)*                                        # repeat content
$                                         # end of string
(?(N)(?!))                                # fail if counter is non-zero.

压实:

^(?:(?:[^?+*{}()[]|]+|.|[(?:^?.|^[^]|[^^])(?:[^]]+|.)*]|((?:?[:=!]|?<[=!]|?>|?<[^Wd]w*>|?'[^Wd]w*')?(?<N>)|)(?<-N>))(?:(?:[?+*]|{d+(?:,d*)?})[?+]?)?||)*$(?(N)(?!))

不太可能。

评估它try..catch或任何您的语言提供。


否,如果您严格讲正则表达式,并且不包括一些实际上下文无关语法的正则表达式实现。

正则表达式存在一个限制,这使得不可能编写与所有正则表达式匹配的正则表达式。 你不能匹配配对的大括号等实现。 正则表达式使用了许多这样的构造,让我们以[]为例。 每当有[必须有匹配]。 足够简单的正则表达式“[。*]”。

正则表达式不可能的是它们可以嵌套。 你怎么能写一个匹配嵌套括号的正则表达式? 答案是你不能没有一个无限长的正则表达式。 您可以通过强力匹配任意数量的嵌套parens,但是您无法匹配任意长的嵌套括号。

这种能力通常被称为计数(您正在计算嵌套的深度)。 根据定义,正则表达式不具备计数能力。

编辑:结束了写这篇博客文章:正则表达式的限制

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

上一篇: Is there a regular expression to detect a valid regular expression?

下一篇: What is the difference between null and undefined in JavaScript?