如何在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
这分解为(匹配就是一切。在匹配中,有一个匹配和一个组匹配。在组匹配中是几个单一匹配。)
仅供参考:
答案 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元字符在字符类中没有特殊含义。并且您无需转义字符类中的+
字符,因此应执行此操作:[-+]
。