【问题标题】:Find a regex character class with a regex使用正则表达式查找正则表达式字符类
【发布时间】:2013-02-16 17:55:09
【问题描述】:

我需要找到一个带有正则表达式的正则表达式字符类(即方括号之间的所有内容)。所以我想出了以下正则表达式:

(?<!\\)\[(?:\^\])?(?:[^]\\]+|\\.)*\]

当我在 Notepad++ 中测试它时,该正则表达式工作得非常好——在搜索窗口 (Ctrl-F) 和 RegEx Helper 插件中——但是当我尝试在 PHP 代码中使用它时出现错误。

$string = '[^abcd\]efgh]';

$pattern = '/
(?<!\\) \[              # an opening square bracket not preceded by a backslash
  (?:\^\])?             # circumflex and closing bracket 0 or 1 times
(?:
  [^]\\]+               # not a closing bracket, nor a backslash 1-n times
 |                      # or
   \\.                  # any escaped character (including an escaped closing bracket)
)*                      # 0-n times
\]                      # closing bracket
/x';

preg_match_all($pattern, $string, $matches);

print_r($matches);

输出:

警告:preg_match_all():编译失败:缺少终止] 对于偏移量 33 处的字符类 C:...\test.php 第 21 行

我哪里错了?

【问题讨论】:

    标签: php regex preg-match notepad++


    【解决方案1】:

    文字反斜杠需要在 PHP 正则表达式中用四个反斜杠表示。因此,尝试

    $pattern = '/(?<!\\\\)\[(?:\^\])?(?:[^]\\\\]+|\\\\.)*\]/'
    

    【讨论】:

    • 所以,我需要将反斜杠作为 PHP 字符串的一部分进行转义,然后将这两个反斜杠作为正则表达式的一部分进行转义。但是当它用于转义任何其他字符时,我不需要双重转义反斜杠。这很奇怪,但它有效。谢谢!
    • @Placido:是的,它很奇怪。好吧,你可以这样解释:'\\[' 是字符串中\[ 的正确表示。但是'\[' 会自动翻译成'\\[',因为这是这里唯一可能的有意义的构造。但这对于实际的反斜杠是不可能的 - 这就是为什么你需要在这里明确并写 \\\\.
    猜你喜欢
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多