2008-11-10 32 views
32

是否可以在正则表达式中跳过捕获组中的几个字符?我正在使用.NET正则表达式,但这应该不重要。正则表达式跳过捕获组中的字符

基本上,我在找的是:

[随机文本] AB123 [随机文本]

,我需要捕捉 'AB123',不带连字符。

我知道AB是2或3个大写字母,123是2或3位数字,但这并不困难。困难的部分(至少对我而言)是跳过连字符。

我想我可以分别捕获这两个,然后连接它们在代码中,但我希望我有一个更优雅的,正则表达式的解决方案。

有什么建议吗?

+0

在JavaScript中你可以:/(AB)\-(123))/.exec("[random文本] AB-123随机文本]“);它现在返回数组[1]和[2] ^^ – hanshenrik 2015-03-26 11:01:04

+0

如何使用积极lookahead(?=)和积极lookbehind(?<=)?基本上这个:(?<= \')([A-Z] {2} - [0-9] {3})(?= \')应该工作。 – 2015-06-01 07:26:36

回答

41

总之:你不能。一个匹配总是连续的,即使它包含了作为零宽度断言的东西,如果你想要在下一个字符后面匹配下一个字符,那么匹配是无法实现的。

+0

您可以使用积极的lookbehead和积极的lookahead – 2015-06-01 07:26:57

+2

真实。但是lookaround不匹配任何东西。位置正则表达式引擎在刺痛中的位置不会改变。 – Tomalak 2015-06-01 07:29:25

15

确实没有办法创建表达式,以便匹配的文本与源文本中找到的不同。你将需要由所述第一和第二部分个别地匹配并且链接该两组或者删除在一个单独的步骤中的连字符:

match = Regex.Match(text, "([A-B]{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, "[A-B]{2,3}-[0-9]{2,3}"); 
matchedText = match.Value.Replace("-", ""); 
+2

还有`match.Result(“$ 1 $ 2”)` – 2015-11-21 19:23:46

4

你声称不可能没有分组+合并它是正确的。

你也可以像杰夫 - 希尔曼那样做,并且在事实发生后仅仅去掉坏字符。

重要的是要注意这里,你是“不使用正则表达式的一切”。

正则表达式针对非平凡问题的复杂解决方案而设计,您不应该对任何事情都使用“哦,我们将使用正则表达式”,并且您不应该陷入思考可以解决的问题在一步的正则表达式中的问题。

当存在一个可行的方法时,无论如何,都可以使用它。

另一个想法,如果您碰巧需要返回代码体中的多个匹配项,请查找基于语言“回调”的正则表达式,该正则表达式允许将任何匹配/找到的组传递给可以执行的函数调用在线替代。 (特别适合做正则表达式替换)。

不知道它是如何工作的。净,但在PHP你会做这样的事情(不准确的代码)

function strip_reverse($a) 
    { 
    $a = preg_replace("/-/", "", $a); 
    return reverse($a); 
    } 
    $b = preg_replace_callback("/(AB[-]?cde)/" , 'strip_reverse' , "Hello World AB-cde" ; 
1

您可以使用嵌套的捕获组,如下所示:

((AB)-(123)) 

第一个捕获组是AB-123,第二是AB,第三个是123。那么你所要做的就是加入第二组和第三组。

0

有点晚了,但我想我想出了这一个。至少有一种方法可以做到这一点。

我用积极的前瞻来停止在我的文本#号。我不想要空间或#号,所以我不得不想出路去“跳过”它们。所以当我被迫再次匹配它们的时候,我把它们扔进了一个我不打算使用的垃圾组(.ie,一个桶),它在代码中。现在,我的位置指针是超出#号的一个字符位置(我想要的位置,跳过空格和#号)。现在我只是匹配到文件名的末尾。并忽略文件扩展名。

(?i)English\\(?<Series>[^ ]+) - (?<Title>.+(?= #))(?<garb1>..)(?<Number>[^.]+)(?-i) 

的文件名这是所使用的是

F:\Downloads\Downloads\500 Comics CCC CBR English\Isukani - Great Girl #01.cbr