首页 > 解决方案 > 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,因为它们都是搜索的一部分。

标签: regexdart

解决方案


如果您使单个选项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 匹配不提供任何更有用的信息。


推荐阅读