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


当前回答

你可以将regex提交给preg_match,如果regex无效,preg_match将返回false。不要忘记使用@来抑制错误消息:

@preg_match($regexToTest, '');

如果正则表达式为//,则返回1。 如果正则表达式没问题,将返回0。 否则将返回false。

其他回答

不太可能的。

用try. catch或你的语言提供的任何方法来评估它。

有了这个版本,你可以用php检查一个字符串的regex -我从上面的例子,并修改了一点:

$re = '/((?:(?:[^?+*{}()[\]\\\\|]+|\\\\.|\[(?:\^?\\\\.|\^[^\\\\]|[^\\\\^])(?:[^\]\\\\]+|\\\\.)*\]|\((?:\?[:=!]|\?<[=!]|\?>)??\)|\(\?(?:R|[+-]?\d+)\))(?:(?:[?+*]|\{\d*(?:,\d*)?\})[?+]?)?|\|)*)/';
$str = '[0-9]{1,}[a-z]';

preg_match($re, $str, $matches, PREG_OFFSET_CAPTURE, 0);

$length = strlen($str);
$length2 = strlen($matches[0][0]);

if($length == $length2) {

   echo "is regex";

} else {

   echo "is no regex";

}

你可以将regex提交给preg_match,如果regex无效,preg_match将返回false。不要忘记使用@来抑制错误消息:

@preg_match($regexToTest, '');

如果正则表达式为//,则返回1。 如果正则表达式没问题,将返回0。 否则将返回false。

/
^                                             # 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
     (?<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)(?!))

评论如下:

这将验证替换和转换吗?

它将只验证替换和转换的正则表达式部分。s / < >这一部分/…/

理论上不可能将所有有效的正则表达式语法与一个正则表达式匹配。

如果正则表达式引擎支持递归,比如PCRE,这是可能的,但它不能再被真正地称为正则表达式了。

实际上,“递归正则表达式”不是正则表达式。但这是一个经常被接受的正则表达式引擎的扩展…具有讽刺意味的是,这个扩展的正则表达式并不匹配扩展的正则表达式。

“在理论上,理论和实践是一样的。但实际上并非如此。”几乎所有了解正则表达式的人都知道正则表达式不支持递归。但是PCRE和大多数其他实现支持的不仅仅是基本的正则表达式。

在grep命令中使用这个shell脚本,它向我显示了一些错误。grep:{}的无效内容。我正在制作一个脚本,可以grep代码库找到所有包含正则表达式的文件

这个模式利用了一个名为递归正则表达式的扩展。正则表达式的POSIX风格不支持这一点。您可以尝试使用-P开关来启用PCRE正则表达式风格。

Regex本身“不是正则语言,因此不能用正则表达式来解析……”

这对于经典正则表达式是正确的。一些现代实现允许递归,这使得它成为一种上下文自由语言,尽管对于这个任务来说有点冗长。

我看到你匹配[]()/\。和其他特殊的正则表达式字符。哪里允许非特殊字符?它似乎可以匹配^(?:[\.]+)$,但不能匹配^abcdefg$。这是一个有效的正则表达式。

[^?+*{}()[\]\\|]将匹配任何单个字符,而不是任何其他结构的一部分。这包括文字(a - z)和某些特殊字符(^,$,.)。

在Javascript中:

SyntaxError

在传递无效正则表达式以求值时引发。

// VALID ONE
> /yes[^]*day/
Out: /yes[^]*day/

// INVALID ONE
> /yes[^*day/
Out: VM227:1 Uncaught SyntaxError: Invalid regular expression: missing /

下面是检查正则表达式字符串是否有效的函数:

步骤1:正则表达式解析器

var RegexParser = function(input) {

    // Parse input
    var m = input.match(/(\/?)(.+)\1([a-z]*)/i);

    // Invalid flags
    if (m[3] && !/^(?!.*?(.).*?\1)[gmixXsuUAJ]+$/.test(m[3])) {
        return RegExp(input);
    }

    // Create the regular expression
    return new RegExp(m[2], m[3]);
};

步骤2:使用解析器

var RegexString = "/yes.*day/"

var isRegexValid = input => {
 try {
 const regex = RegexParser(input);
 }
 catch(error) {
   if(error.name === "SyntaxError") 
    {
      return false;
    }
    else 
    {
     throw error;
    }
 }
 return true;
}