为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

慕雪6173905 2019-11-20 14:45:09

您如何在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匹配一个数字。后面的+匹配一个或多个数字。*匹配零个或多个数字后。?之后说这个比赛是可选的。

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


查看完整描述

3 回答

?
哆啦的时光机

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


查看完整回答
反对 回复 2019-11-20
?
智慧大石

请注意,这是对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'

毫无疑问,某些正则表达式实现可能与我刚刚发布的有所不同,但是大多数语言都将遵守这些规则(至少我使用过的所有语言!)。正如您所注意到的,在字符类中过度转义字符是安全的:这不会造成任何危害。两个类[+]和[\+]将匹配文字+。恕我直言,第一个是首选,因为我发现一个正则表达式有太多的转义字符难以阅读。但是有些人会不同意我的看法,并发现通过使用转义符(虽然不是必需的)可以更清楚地知道字面值+是匹配的,而不是贪婪的量词。


希望这能说明问题。


查看完整回答
反对 回复 2019-11-20
?
慕森卡

附带说明一下,字符类始终匹配单个字符,并且“正常”元字符不适用于它们。因此,您的课程[-|\+]与以下三个字符之一匹配-|+。如您所见,逻辑OR元字符在字符类内部没有特殊含义。而且您不必+在字符类中转义该字符,因此应该这样做:[-+]


查看完整回答
反对 回复 2019-11-20

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信