代码之家  ›  专栏  ›  技术社区  ›  Zachary Scott

如何在正则表达式中返回引用“内部”选项(())。

  •  2
  • Zachary Scott  · 技术社区  · 15 年前

    如何在regex中返回引用内括号?

    样本数据是一个产品价格表,根据购买数量显示不同的价格折扣。格式是quantitylow-quantityhigh:priceper;multiples。

    我使用linqpad构造了这个c regex表达式来分离各个部分,这显示了regex数据分离的一个方便的可视化。在本例中,有“内部”圆括号(选项),用于创建分层数据结构。

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

    这可以归结为(匹配就是一切。在Match中,有一个单匹配和一个组匹配。在组匹配中有几个单独的匹配。)

    • MatchCollection(2项)
      • 组集合(4项)
        • CaptureCollection(1项)()组“1-4:2;”
        • CaptureCollection(1项)()组“1”
        • CaptureCollection(1项)()组“4”
        • CaptureCollection(1项)()组“2”
      • CaptureCollection(1项)()匹配“1-4;2;”
      • 组集合(4项)
        • CaptureCollection(1项)()组“5-9:1.89”
        • CaptureCollection(1项)()组“5”
        • CaptureCollection(1项)()组“9”
        • CaptureCollection(1项)()组“1.89”
      • CaptureCollection(1项)()匹配“5-9:1.89”

    仅供参考:

    • ()括号组找到了可以被a \1..\9引用的结果(我想)。
    • \ D匹配一个数字。后面的+与一个或多个数字匹配。*在匹配零位或更多位之后。?在说这个匹配是可选的之后。
    • . 匹配单个字符。。在本例中匹配句点或小数。
    3 回复  |  直到 15 年前
        1
  •  4
  •   Laurence Gonsalves    15 年前

    只使用 \1 \9 (或) $1 $9 在一些regex实现中),就像您通常会做的那样。编号从左到右,基于打开paren的位置(因此嵌套组的编号高于嵌套组中的编号)。

        2
  •  3
  •   Bart Kiers    15 年前

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

    奇怪的是,这两种方法似乎都很有效。我找到了“调节器”,它至少显示了regex是如何崩溃的。如果它有一个设置实现的特性,我想我已经开始工作了。”

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

    不,您不需要退出加号,在本例中是连字符。在字符类中,以下字符具有特殊含义: ] , ^ - . 只有这三个字符 可以 需要逃跑(注意 [ 不需要逃跑!)我说 可以 因为这取决于这些元字符出现的位置。这个 ^ 只有特殊意义(如 否定指示灯 )当放置在字符类的开头时,在其他地方,它不需要转义,只匹配文本 ^ .举例说明:

    [^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'
    

    毫无疑问,有些regex实现可能与我刚刚发布的不同,但大多数语言都将遵守这些规则(至少我使用的所有语言!).正如你所注意到的,这是安全的 越狱 字符类中的字符:它不会造成任何伤害。两个班级 [+] [\+] 将与文本匹配 + . imho,第一个是首选的,因为我发现一个正则表达式有太多的转义,很难阅读。但是有些人会不同意我的观点,并且发现使用一个转义词(虽然不是必需的),字面上的 + 正在匹配而不是贪婪的量词。

    希望能把事情弄清楚。

        3
  •  1
  •   Bart Kiers    15 年前

    作为补充说明,字符类总是与单个字符匹配,“普通”元字符不适用于它们。所以你们班 [-|\+] 匹配三个字符中的一个 - , | + . 如您所见,逻辑或元字符在字符类中没有特殊的含义。你不需要逃避 + 字符类中的字符,因此应该这样做: [-+] .