正则表达式以跳过捕获组中的字符

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


基本上,我正在寻找的是:


[随机文本] AB-123 [随机文本]


并且我需要不带连字符的情况下捕获“ AB123”。


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


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


有什么建议么?


暮色呼如
浏览 1058回答 3
3回答

郎朗坤

简而言之:你不能。匹配始终是连续的,即使它包含零宽度的断言,如果要转到下一个字符,也就无法匹配下一个字符。

拉丁的传说

您的断言,如果没有分组再加上它,就不可能做到这一点是正确的。您也可以像Jeff-Hillman一样,只在事发之后剔除坏角色。这里要注意的重要一点是,您“不要对所有内容都使用正则表达式”。正则表达式是为不太复杂的问题而设计的,用于不太复杂的解决方案,您不应该对所有内容都使用“哦,我们将使用正则表达式”,并且您不应习惯于认为自己可以通过简单的方法解决问题。一步式正则表达式。当存在可行的可行方法时,请务必使用它。如果您恰巧需要在代码体中返回多个匹配项,则可以使用另一种想法,即寻找基于语言“回调”的正则表达式,该表达式允许将任何匹配/找到的组传递给可以进行内联替换的函数调用。(在执行regexp时特别方便)。不知道它如何在.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" ; 
打开App,查看更多内容
随时随地看视频慕课网APP