是否有正则表达式来检测有效的正则表达式?
是否有可能使用另一个正则表达式检测有效的正则表达式? 如果是这样,请给下面的例子代码。
/
^ # 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?