【问题标题】:How to know which option in Regex was matched?如何知道 Regex 中的哪个选项匹配?
【发布时间】:2019-03-13 08:01:38
【问题描述】:

我有一个匹配多个选项的正则表达式。

例如^0x[\da-fA-F]+|-?\d+$ -- 匹配十进制或十六进制文字的正则表达式

是否有一个选项可以知道哪个选项最终与模式匹配?

所以……

  • -10 - 匹配小数选项
  • 0x1Af - 十六进制选项匹配

【问题讨论】:

  • 您的正则表达式不匹配任何字符串。
  • @WiktorStribiżew:修复了正则表达式.. 现在示例工作
  • 但这仍然是错误的,因为每个部分都只固定在一侧。你的意思是使用^(?:0x[\da-fA-F]+|-?\d+)$。但是,要解决您的问题,请添加捕获组 ^(?:(0x[\da-fA-F]+)|(-?\d+))$ 并检查 .Success 属性是否为 true。
  • @WiktorStribiżew:如果你的陈述更清楚就好了。但无论如何,这不是我的问题——Regex 只是一个例子。
  • 顺便说一句,here is an answer 显示如何检查 Group.Success 属性。

标签: c# regex


【解决方案1】:

我认为你的意思是这个正则表达式:

^(?:-?\d+|0x[\da-fA-F]+)$

带有开始和结束锚点不是部分的替代品。

您可以捕捉不同的选择:

^(?:(-?\d+)|(0x[\da-fA-F]+))$

现在你只需要检查一个组是否不为空。如果它与第一个备选方案匹配,则组 1 将是非空的。如果它匹配第二个选项,组 2 将是非空的:

Match m = Regex.Match(...);
if (m.Groups[1] != null) {
    // first alternative matched!
} else if (m.Groups[2] != null) {
    // second alternative matched!
}

您还可以为您的组命名以使您的代码更具可读性:

^(?:(?<decimal>-?\d+)|(?<hex>0x[\da-fA-F]+))$

现在您应该检查m.Groups["decimal"]m.Groups["hex"]

【讨论】:

  • 谢谢 - 这是通过使用组来了解哪个选项的优雅方式。正则表达式本身不是这里真正的问题(只是一个例子)......
  • 为了保持一致性,我会将 nullchecks 更改为 not-nullchecks,因为您说它已经交叉(如果 m.Groups[1]null,这意味着这不是我们正在寻找的对吧?)
  • “所以你不能使用这个正则表达式来确定一个数字的基数” 如果预期的十六进制字符串总是以0x开头,这不应该是一个问题。
  • 您也可以在正则表达式中使用命名组。
  • @Asunez 是的,这确实更直观。
猜你喜欢
  • 1970-01-01
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
  • 2012-09-07
  • 2020-07-02
  • 2013-01-23
  • 2011-10-27
  • 1970-01-01
相关资源
最近更新 更多