Regex “如何支持引用”;“内部”;正则表达式中的选择(())?
如何在正则表达式中反向引用内括号? 样本数据是一个产品价格表,根据购买数量显示不同的价格折扣。格式为quantityLow-quantityHigh:pricePer;倍数 我使用LINQPad构建了这个C#Regex表达式来分离各个部分,这显示了一个方便的Regex数据分离可视化。在本例中,有“内部”括号(选择),创建了一个层次数据结构Regex “如何支持引用”;“内部”;正则表达式中的选择(())?,regex,Regex,如何在正则表达式中反向引用内括号? 样本数据是一个产品价格表,根据购买数量显示不同的价格折扣。格式为quantityLow-quantityHigh:pricePer;倍数 我使用LINQPad构建了这个C#Regex表达式来分离各个部分,这显示了一个方便的Regex数据分离可视化。在本例中,有“内部”括号(选择),创建了一个层次数据结构 string mys = "1-4:2;5-9:1.89"; Regex.Matches (mys, @"((\d+)[-|\+](\d*):(\d+\.?\
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”
- 小组收集(4项)
- ()括号组找到了可由\1..\9引用的结果(我想)
- \d匹配一个数字。后面的+匹配一个或多个数字。*后匹配零个或多个数字?之后说这场比赛是可选的
- 。匹配单个字符。\。在这种情况下匹配句点或小数点
- 只需使用
\1
<代码>\9(或者在某些正则表达式实现中,$1
…$9
)与您通常的做法相同。编号是从左到右的,基于打开组的位置(因此嵌套组的编号高于嵌套组的编号)。作为旁注,字符类始终匹配单个字符,“普通”元字符不适用于它们。因此,类[-\+]
与三个字符-
、
或+
中的一个匹配。如您所见,逻辑或元字符在字符类中没有特殊含义。您不需要在character类中转义+
字符,因此应该这样做:[-+]
注意,这是对Zim博士评论的回复:
奇怪的是,这两种方法似乎都很有效。我选择了“监管者”,它至少显示了正则表达式是如何分解的。如果它有一个设置实现的功能,我想我是在做生意 但我的回答太长,无法放在评论框中 不,您不需要转义加号,在本例中是连字符。在字符类中,以下字符具有特殊含义:
]
、^
和-
。这三个字符是可能需要转义的唯一字符(请注意,[
不需要转义!)。我说可能是因为它取决于这些元字符出现的位置。^
只有一个特殊的含义(作为一个否定指示符)当放置在字符类的开头时,它不需要转义,只需匹配文本^
[^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'
毫无疑问,一些正则表达式的实现可能与我刚刚发布的有所不同,但大多数语言都会遵守这些规则(至少我使用过所有语言!)。正如您所注意到的,在字符类中过度转义字符是安全的:它不会造成任何伤害。类[+]
和[\+]
将匹配文本+
。嗯,第一个是首选的,因为我发现一个包含太多转义的正则表达式很难读取。但是一些人会不同意我的观点,并发现通过使用转义(虽然不是必需的),文本+
将被匹配,而不是贪婪的量词
希望这能把事情弄清楚。或
\k
在命名组太多的情况下反引用命名组(?…)
。任何人都有使用自动编号(标识)进行命名反引用的示例代码吗?类似于(?[1-8]…)的代码,其中包含名称1、名称2、名称3、名称4等。在研究了这一点之后,我同意管道没有“或”,但您是否仍然需要在类括号中“引用”减号和加号?例如:/^[\d\s()\-\+\/]*$/将匹配电话号码714/921-5424(VisiBone图表中的示例),或者此实现依赖于此?奇怪的是,这两种方式似乎都很好。我选择了“调节器”这至少显示了正则表达式是如何分解的。如果它有一个设置实现的功能,我想我是在做生意。请注意,类/^[\d\s\(\)\-\+\/]*$/
相当于/^[\d\s()+\/-]*$/
这个答案已添加到“字符类”下的。