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

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

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

猛跑小猪 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 回答

?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

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


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

TA贡献1946条经验 获得超3个赞

请注意,这是对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
  • 3 回答
  • 0 关注
  • 995 浏览

添加回答

举报

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