正则expression式可以跳过捕获组中的字符
在正则expression式中是否可以跳过捕获组中的几个字符? 我正在使用.NET正则expression式,但这不应该。
基本上,我正在寻找的是:
[随机文本] AB-123 [随机文本]
我需要捕获“AB123”,没有连字符。
我知道AB是2或3个大写字母,123是2或3个数字,但这并不困难。 困难的部分(至less对我来说)是跳过连字符。
我想我可以分别捕获这两个,然后将它们连接在代码中,但我希望我有一个更优雅的,正则expression式的解决scheme。
有什么build议么?
总之:你不能。 一个匹配总是连续的,即使它包含了作为零宽度断言的东西,如果你想要find下一个字符,就没有办法匹配下一个字符。
实际上没有办法创build一个expression式,使得匹配的文本与源文本中find的不同。 您需要在单独的步骤中删除连字符,方法是分别匹配第一个和第二个部分并连接两个组:
match = Regex.Match( text, "([AB]{2,3})-([0-9]{2,3})" ); matchedText = string.Format( "{0}{1}", match.Groups.Item(1).Value, match.Groups.Item(2).Value );
或者通过在与匹配过程分开的步骤中删除连字符:
match = Regex.Match( text, "[AB]{2,3}-[0-9]{2,3}" ); matchedText = match.Value.Replace( "-", "" );
你的断言是不可能的,如果没有分组和排他性是正确的。
你也可以像杰夫 – 希尔曼(Jeff-Hillman)那样做,只是在事实之后把坏人性剥离出来。
重要的是在这里注意,是你“不要使用正则expression式的一切”。
正则expression式是针对非平凡问题的复杂解决scheme而devise的,对于任何事情你都不应该使用“噢,我们将使用正则expression式”,而且你也不会陷入思考可以解决问题的习惯一步式正则expression式。
如果有一个可行的微不足道的办法,一定要用它。
一个替代的想法,如果你碰巧需要返回一个代码体中的多个匹配是寻找你的语言“callback”基于正则expression式,它允许传递任何匹配/find组到一个函数调用,可以做内联replace。 (特别是在做正则expression式replace)。
不知道如何在.Net中工作,但在PHP中,你会做一些像(不精确的代码)
function strip_reverse( $a ) { $a = preg_replace("/-/", "", $a ); return reverse($a); } $b = preg_replace_callback( "/(AB[-]?cde)/" , 'strip_reverse' , "Hello World AB-cde" ;
您可以使用嵌套的捕获组,如下所示:
((AB)-(123))
第一个捕获组是AB-123
,第二个是AB
,第三个是123
。 那么你所要做的就是join第二和第三组。