有没有正则表达式可以检测有效的正则表达式?

54 浏览
0 Comments

有没有正则表达式可以检测有效的正则表达式?

能否用另一个正则表达式来检测一个有效的正则表达式? 如果可以,请在下面给出示例代码。

admin 更改状态以发布 2023年5月21日
0
0 Comments

不太可能。

try..catch或者你所使用的编程语言提供的其他方法来评估它。

0
0 Comments

/
^                                             # 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)和某些特殊字符(^、$、.)。

0