正则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第二和第三组。