在正则表达式中,是否可以跳过捕获组中的几个字符?我正在使用.NET正则表达式,但这不重要。
基本上,我需要的是:
[随机文本]AB-123[随机文本]
我需要捕获 'AB123',没有连字符。
我知道AB是2或3个大写字母,而123是2或3个数字,但这不难。对我来说难的部分(至少是对我来说)是跳过连字符。
我猜我可以分别捕获它们然后在代码中连接它们,但我希望有一个更优雅的、仅使用正则表达式的解决方案。
有什么建议吗?
在正则表达式中,是否可以跳过捕获组中的几个字符?我正在使用.NET正则表达式,但这不重要。
基本上,我需要的是:
[随机文本]AB-123[随机文本]
我需要捕获 'AB123',没有连字符。
我知道AB是2或3个大写字母,而123是2或3个数字,但这不难。对我来说难的部分(至少是对我来说)是跳过连字符。
我猜我可以分别捕获它们然后在代码中连接它们,但我希望有一个更优雅的、仅使用正则表达式的解决方案。
有什么建议吗?
实际上,没有一种方法可以创建一个表达式,使得匹配的文本与源文本不同。您需要单独删除连字符,可以通过分别匹配第一部分和第二部分,并将两个组合并来完成:
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( "-", "" );
match.Result("$1$2")
。 - Alan Moore
((AB)-(123))
AB-123
,第二个是AB
,第三个是123
。然后你只需要用空格连接第二个和第三个组即可。 function strip_reverse( $a )
{
$a = preg_replace("/-/", "", $a );
return reverse($a);
}
$b = preg_replace_callback( "/(AB[-]?cde)/" , 'strip_reverse' , "Hello World AB-cde" ;
有点晚了,但我想我解决了这个问题。至少有一种方法可以做到。
我使用了正向预查来停在文本中的#号处。我不想要空格或#号,所以我必须想出一个方法来“跳过”它们。因此,当我被迫再次匹配它们时,我将它们倒入一个我不打算使用的垃圾组(即一个位桶),在代码中是.。现在,我的位置指针在#号的后面一个字符位置(我想要跳过空格和#号的位置)。然后我只需匹配到文件名的结尾处的.并忽略文件扩展名。
(?i)English\\(?<Series>[^ ]+) - (?<Title>.+(?= #))(?<garb1>..)(?<Number>[^.]+)(?-i)
这个被使用的文件名是
F:\Downloads\Downloads\500 Comics CCC CBR English\Isukani - Great Girl #01.cbr
$Match.Title
和$Match.Number
,而不仅仅是跳过不需要的字符。 - Hicsy$Match.Title
和$Match.Number
,而不仅仅是跳过不需要的字符。 - undefined我对这方面还比较新,但您可以使用竖杠符号 |
作为或运算符。
这在 .NET 中可能适用:
((?<=[A-Z]{2}-)\d\d\d)|([A-Z]{2}(?=-\d\d\d))
\(\([A-Z]\{2}-\)\@<=\d\d\d\)\|\([A-Z]\{2}\(-\d\d\d\)\@=\)