对于正则表达式应该如何处理嵌套括号的捕获行为,是否有定义的行为?更具体地说,您能合理地预期不同的引擎将捕获第一个位置的外括号,并在后续位置嵌套圆括号吗?

考虑下面的PHP代码(使用PCRE正则表达式)

<?php
  $test_string = 'I want to test sub patterns';
  preg_match('{(I (want) (to) test) sub (patterns)}', $test_string, $matches);
  print_r($matches);
?>

Array
(
    [0] => I want to test sub patterns  //entire pattern
    [1] => I want to test           //entire outer parenthesis
    [2] => want             //first inner
    [3] => to               //second inner
    [4] => patterns             //next parentheses set
)

首先捕获整个括号内的表达式(我想测试),然后捕获内括号内的模式("want"和"to").这是合乎逻辑的,但我可以看到一个同样合乎逻辑的 case ,首先捕获子括号,然后捕获整个模式.

那么,这是正则表达式引擎中"首先捕获整个事物"定义的行为,还是取决于模式的上下文和/或引擎的行为(PCRE不同于C#的不同于Java的不同于等)?

推荐答案

perlrequick

如果正则表达式中的分组是

Caveat:不包括非捕获组左括号(?=)

Update

我不太使用PCRE,因为我通常使用真实的东西;),但PCRE's docs与Perl的相同:

子模式

2.它将子模式设置为捕获子模式.这意味着,当整个模式匹配时,与子模式匹配的主题字符串部分将通过pcre_exec()ovector参数传递回调用者.左括号从左到右(从1开始)计数,以获得捕获子模式的编号.

例如,如果字符串"the red king"与模式匹配

the ((red|white) (king|queen))

捕获的子字符串是"红色国王"、"红色"和"国王",分别编号为1、2和3.

如果PCRE正在偏离Perl正则表达式兼容性,那么可能应该重新定义首字母缩略词——"Perl同源正则表达式"、"Perl可比正则表达式"之类的词.或者干脆go 掉字母的意义.

.net相关问答推荐

Docker镜像mcr.microsoft.com/dotnet/aspnet:8.0不能在Windows上构建

使用 Powershell TOM 在 SSAS 表格中创建分区

使用 PowerShell 从文件夹中获取文件名的最快\最好的方法是什么?

MassTransit RespondAsync 无法返回空值

在 C# 中生成随机小数

是否可以模拟 .NET HttpWebResponse?

每第 N 个字符/数字拆分一个字符串/数字?

通用枚举到int的C#非装箱转换?

BackgroundWorker 中未处理的异常

OpenCV的.Net(dotNet)包装器?

单元测试 C# 保护方法

无法使用 Unity 将依赖项注入 ASP.NET Web API 控制器

何时何地使用 GetType() 或 typeof()?

我应该绑定到 ICollectionView 还是 ObservableCollection

确定使用 ContextMenuStrip 的控件

为什么 Roslyn 中有异步状态机类(而不是 struct )?

带有嵌套控件的设计模式

WinForms 中的模型视图演示者

在foreach循环中修改列表的最佳方法是什么?

C#/.NET 中仅命名空间的类可见性?