如何在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
这可以归结为(匹配就是一切)。在比赛中,有一场比赛和一组比赛。在组比赛中有几场比赛。)
- CaptureCollection (1 item) () Match "1-4;2;"
- Group Collection (4 items)
- CaptureCollection (1 item) () Group "5-9:1.89"
- CaptureCollection (1 item) () Group "5"
- CaptureCollection (1 item) () Group "9"
- CaptureCollection (1 item) () Group "1.89"
- CaptureCollection (1 item) () Match "5-9:1.89"
仅供参考:
发布于 2009-10-09 20:00:44
只需像往常一样使用\1
. \9
(或者在某些正则表达式中使用$1
. $9
)。编号是从左到右,基于打开的paren的位置(因此嵌套组的数目比嵌套组内的组(组)要高)。
发布于 2009-10-12 07:25:54
请注意,这是对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,第一个是首选的,因为我发现一个正则表达式太多的逃避很难读。但是,有些人会不同意我的观点,并发现使用转义(虽然不是必要的),文字+
被匹配而不是贪婪的量词,这是非常明显的。
希望这能把事情弄清楚。
发布于 2009-10-09 20:27:37
另外,字符类总是匹配单个字符,而“普通”元字符不适用于它们。所以,[-|\+]
类与-
、|
或+
这三个字符中的一个匹配。正如您所看到的,逻辑或元字符在字符类中没有特殊意义。并且您不需要在字符类中转义+
字符,因此应该这样做:[-+]
。
https://stackoverflow.com/questions/1545751
复制相似问题