regex - RE 中的哪个组匹配?
问题描述
我在 Dart 中有一个 RE 与不相交的替代方案,即一个替代方案或没有一个匹配项。一个简单的例子:
var re = RegExp('(?<A>a)|(?<B>b)');
var m = re.matchAsPrefix('ab');
我想知道A组还是B组是比赛(在现实生活中还有更多的选择)。在 Python 中,我写:
matchedName = m.lastgroup
matchedText = match.groupdict()[matchedName]
Dart 中是否有等价物?groupNames
返回 A 和 B,因为它们都是搜索的一部分。
解决方案
如果您使单个选项capture,您可以看到实际匹配的选项:
var re = RegExp(r"(ab)|(cd)");
var m = re.matchAsPrefix("ab");
assert(m[1] != null); // Matched!
assert(m[2] == null); // Did not participate in the match.
未参与的捕获组将具有 value null
,该值不同于实际匹配某些内容的捕获组,甚至是空字符串。
对于您给出的示例:
var re = RegExp(r'(?<A>a)|(?<B>b)');
var m = re.matchAsPrefix('ab') as RegExpMatch;
assert(m.namedGroup("A") != null);
assert(m.namedGroup("B") == null);
assert(m[1] != null); // Same as "A"
assert(m[2] == null); // Same as "B"
如果您有很多替代方案,那么跟踪所有替代方案的开销是相当大的,您可能需要考虑除 RegExp 之外的其他方法。不过,它会工作。
没有更简单的方法来检查参与度。Dart RegExp 行为在编译为 JavaScript 时必须有效,并且 JavaScript 匹配不提供任何更有用的信息。
推荐阅读
- kubernetes - 连接到 microk8s 中的 CoreDNS pod
- xml - 如何在“pyspark”中读取 xml 文件?
- mapping - 使用通配符的 Informatica Cloud (IICS) 文件名
- api - 通过 API 将数据带到 S3 存储桶时,如何同步源系统中的数据更改?
- powershell - 无法在 SharePoint Online 中使用 PowerShell 启用受限查看权限
- java - 无法将 WebLogic 添加到 NetBeans。添加 WebLogic 服务器对话框不接受提供的路径
- mysql - 错误:#1034,表 'db' 的错误文件密钥尝试修复它 - phpmyadmin
- python - HyperException:输入文件中的列过多:'file.csv' 行:4511265 | 画面
- git - Git for Windows: SSL certificate problem: certificate has expired
- xml - 使用 XSL 计算元素