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

您如何在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个项目)

团体收藏(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”

仅供参考:


()括号组发现了可以由\ 1 .. \ 9引用的结果(我认为)。

\ d匹配一个数字。后面的+匹配一个或多个数字。*匹配零个或多个数字后。?之后说这个比赛是可选的。

。匹配一个字符。\。在这种情况下,匹配句点或小数


猛跑小猪
浏览 1004回答 3
3回答

哆啦的时光机

只要使用\1... \9(或者$1... $9在一些正则表达式实现)就像你通常会。编号从左到右,基于开放括号的位置(因此,嵌套组的编号要大于嵌套在其中的组的编号)。

智慧大石

请注意,这是对Zim博士的评论的答复:“奇怪的是,两种方法似乎都可以正常工作。我选择了“ Regulator”,它至少说明了正则表达式是如何分解的。如果它具有设置实现的功能,那么我认为我有业务。”但是我的回答对于评论框来说太长了。不,您不需要转义加号(在这种情况下为连字符)。在字符类中,以下字符有特殊含义:],^和-。这三个字符是唯一可能需要转义的字符(请注意,[不需要转义!)。我说可能是因为它取决于这些元字符出现的位置。该^只具有特殊的含义(作为否定指标)时,放置在一个字符类的开始,在其他地方,它不需要逃逸,将只匹配文字^。一些例子说明:[^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'毫无疑问,某些正则表达式实现可能与我刚刚发布的有所不同,但是大多数语言都将遵守这些规则(至少我使用过的所有语言!)。正如您所注意到的,在字符类中过度转义字符是安全的:这不会造成任何危害。两个类[+]和[\+]将匹配文字+。恕我直言,第一个是首选,因为我发现一个正则表达式有太多的转义字符难以阅读。但是有些人会不同意我的看法,并发现通过使用转义符(虽然不是必需的)可以更清楚地知道字面值+是匹配的,而不是贪婪的量词。希望这能说明问题。
打开App,查看更多内容
随时随地看视频慕课网APP