如何在正则表达式中引用“内部”选择(())?

时间:2009-10-09 19:54:49

标签: regex

如何在Regex中引用引用内括号?

样本数据是产品价格表,显示基于购买数量的不同价格中断。格式为quantityLow - quantityHigh:pricePer;数倍。

我使用LINQPad构建这个C#Regex表达式来分离各部分,这显示了Regex数据分离的方便可视化。在此示例中,存在“内部”括号(选择),从而创建分层数据结构。

string mys = "1-4:2;5-9:1.89";
Regex.Matches (mys, @"((\d+)[-|\+](\d*):(\d+\.?\d*);?)").Dump();  // Graphically show

这分解为(匹配就是一切。在匹配中,有一个匹配和一个组匹配。在组匹配中是几个单一匹配。)

  • MatchCollection(2件物品)
    • Group Collection(4件物品)
      • CaptureCollection(1项)()组“1-4:2;”
      • CaptureCollection(1项)()组“1”
      • CaptureCollection(1项)()组“4”
      • CaptureCollection(1项)()组“2”
    • CaptureCollection(1项)()匹配“1-4; 2;”
    • Group Collection(4件物品)
      • CaptureCollection(1项)()组“5-9:1.89”
      • CaptureCollection(1项)()组“5”
      • CaptureCollection(1项)()组“9”
      • CaptureCollection(1项)()组“1.89”
    • CaptureCollection(1项)()匹配“5-9:1.89”

仅供参考:

  • ()括号组找到的结果可以用\ 1 .. \ 9引用(我认为)。
  • \ d匹配一个数字。 +后匹配一个或多个数字。 *匹配零个或多个数字后。 ?之后说这场比赛是可选的。
  • 。匹配单个字符。 \。在这种情况下匹配句点或小数。

3 个答案:

答案 0 :(得分:4)

只需像往常一样使用\1 ... \9(或$1 ... $9在某些正则表达式实现中)。编号从左到右,基于打开的paren的位置(因此嵌套组的编号大于它嵌套在其中的组)。

答案 1 :(得分:3)

请注意,这是对Zim博士评论的回复:

  

“奇怪的是,两种方式似乎都很好。我选择了”Regulator“,它至少显示了正则表达式是如何分解的。如果它具有设置实现的功能,我认为我在做生意。”

但我的回答对于评论框来说太长了。

不,你不需要逃避加号,在这种情况下是连字符。在字符类中,以下字符具有特殊含义:]^-。这三个字符是可能需要转义的唯一字符(注意[不需要转义!)。我说可能因为它取决于这些元字符出现的位置。 ^只有一个特殊含义(作为否定指示符)放置在字符类的开头,在别处,它不需要转义,只匹配文字{{1} }。举例说明:

^

当在字符类的开头或结尾放置 not 时,连字符仅具有特殊含义(作为范围指示符)。例子:

[^a]   // special meaning: matches any character except 'a'
[a^]   // matches 'a' or '^'
[\^a]  // matches '^' or 'a'

毫无疑问,一些正则表达式的实现可能与我刚发布的不同,但大多数语言都符合这些规则(至少我使用过的所有语言!)。正如您所注意到的,在字符类中超越字符是安全的:它不会造成任何伤害。类[a-c] // special meaning: matches 'a', 'b' or 'c' [ac-] // matches 'a', 'c' or '-' [-ac] // matches '-', 'a' or 'c' [a\-c] // matches 'a', '-' or 'c' [+]都将与文字[\+]匹配。恕我直言,第一个是首选,因为我发现一个难以阅读太多逃避的正则表达式。但有些人会不同意我的意见,发现通过使用转义(虽然没有必要),文字+被匹配而不是贪婪的量词,这是非常清楚的。

希望能够解决问题。

答案 2 :(得分:1)

作为旁注,字符类总是匹配单个字符,而“普通”元字符不适用于它们。因此,您的课程[-|\+]会与三个字符-|+中的一个匹配。如您所见,逻辑OR元字符在字符类中没有特殊含义。并且您无需转义字符类中的+字符,因此应执行此操作:[-+]