有没有正则表达式可以检测有效的正则表达式?
/ ^ # 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 (?: [^\]\\]+ | \\. )* \] | \( (?:\?[:=!] | \?<[=!] | \?> | \?<[^\W\d]\w*> | \?'[^\W\d]\w*' )? # opening of group (?) # increment counter | \) # closing of group (?<-N>) # decrement counter ) (?: (?:[?+*]|\{\d+(?:,\d*)?\}) [?+]? )? # quantifiers | \| # alternative )* # repeat content $ # end of string (?(N)(?!)) # fail if counter is non-zero.
压缩后:
^(?:(?:[^?+*{}()[\]\\|]+|\\.|\[(?:\^?\\.|\^[^\\]|[^\\^])(?:[^\]\\]+|\\.)*\]|\((?:\?[:=!]|\?<[=!]|\?>|\?<[^\W\d]\w*>|\?'[^\W\d]\w*')?(?)|\)(?<-N>))(?:(?:[?+*]|\{\d+(?:,\d*)?\})[?+]?)?|\|)*$(?(N)(?!))
来自评论:
这个是否能验证替换和翻译?
它将只验证替换和翻译的正则表达式部分。s/<这里部分>/.../
从理论上讲,使用正则表达式匹配所有有效的语法是不可能的。
如果正则表达式引擎支持递归,如PCRE,那么就可以实现。但这就不能被称为正则表达式了。
的确,"递归正则表达式"不是正则表达式。但这是一个经常接受的正则表达式引擎扩展...具有讽刺意味的是,这个扩展的正则表达式不能匹配扩展的正则表达式。
"理论上来说,理论和实践是一样的。在实践中,它们是不同的。"几乎所有懂正则表达式的人都知道正则表达式不支持递归。但是PCRE和其他大多数实现都支持比基本正则表达式更多的功能。
在grep命令中使用shell脚本时,它给我显示一些错误.. grep: Invalid content of {}. 我正在编写一个脚本,可以使用grep查找包含正则表达式的所有文件。
这种模式利用了一个叫做递归正则表达式的扩展。这在POSIX正则表达式中不被支持。您可以尝试使用-P开关,以启用PCRE正则表达式风格。
引文本身“不是一个规则语言,因此不能通过正则表达式进行解析……”
这对于传统正则表达式来说是真的。一些现代实现允许递归,使其成为上下文自由语言,尽管对于此任务而言,它有些冗长。
我看到你在匹配`[]()/\`和其他特殊的正则表达式字符。你在哪里允许非特殊字符?似乎这将匹配^(?:[\.]+)$,但不会匹配^abcdefg$。这是一个有效的正则表达式。
`[^?+*{}()[\]\\|]`将匹配任何单个字符,而不是任何其他结构的一部分。这包括字面意义上的(a-z)和某些特殊字符(^、$、.)。