为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

慕容3067478 2019-07-08 14:52:19

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

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



查看完整描述

3 回答

?
墨色风雨

/

^                                             # 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

/

这是一个递归正则表达式,许多regex引擎不支持它。基于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

     (?<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.

压实:


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

分享


查看完整回答
反对 回复 2019-07-08
?
FFIVE

不太可能。

在一个try..catch或者你的语言所提供的一切。


查看完整回答
反对 回复 2019-07-08
?
慕姐8265434

如果严格地说正则表达式,而不包括一些实际上是上下文无关语法的正则表达式实现,则不会。

正则表达式有一个限制,使得不可能编写匹配所有和唯一正则表达式的正则表达式。您无法匹配实现,如大括号的配对。Regexes使用了许多这样的结构,让我们以[]为例。无论何时有[必须有匹配]。简单到一个正则表达式“[.*]”。

REXEX之所以不可能,是因为它们可以嵌套。如何编写与嵌套括号匹配的正则表达式?答案是,没有无限长的正则表达式是不可能的。您可以通过蛮力匹配任意数量的嵌套父母,但您永远无法匹配任意长的嵌套括号集。

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

编辑:最后写了一篇关于此的博客文章:正则表达式限制


查看完整回答
反对 回复 2019-07-08

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信