假设我有以下文字:
abc123def
abc1234567890def
在本文中,我只想捕获文本的“abc”和“def”部分,完全排除数字。这可以用以下表达式来完成:
(abc)[0-9]*(def)
。
继续之前的快速说明:我知道您也可以使用
(\D)
或类似的东西来达到相同的结果。但就本示例而言,假设您无法利用我要删除的组与单词其余部分的字符类型不同的事实。这样做只是为了更好地说明我的问题。
然而,这样做的问题是它将“abc”和“def”分成不同的捕获组。 由于我使用此正则表达式的情况,我无法使用任何代码将 2 个正则表达式组合并在一起。这意味着我正在尝试转换我已经必须输出
abcdef
而不是 abc
和 def
的 reg-ex。
我已经尝试过...
(abc([0-9]*)def)
,希望捕获组不包含数字字符串,因为它位于自己的捕获组中
abc123def
和 abc1234567890def
(abc(?=[0-9]*)def)
,希望能够“向前看”数字串
no result
(abc\2)[0-9]*(def)
和(abc)[0-9]*(\1def)
,希望带有反向引用的捕获将包括另一组的结果
abc
为(abc\2)[0-9]*(def)
,no result
为
(abc)[0-9]*(\1def)
(abc(?:[0-9]*)def)
,因为我误解了文档,认为“非捕获组”意味着它会跳过其中的任何内容
abc123def
和 abc1234567890def
到目前为止,我尝试过的任何方法都不起作用,要么返回“abc”(没有“def”),要么什么也不返回。那么,如何返回“abc”和“def”,同时排除同一捕获组中它们之间的数字?我不确定这是否重要,但本文中使用的 reg-ex 已使用 https://regexr.com/ 进行了测试,并检查了
global
和 multiline
表达式标志。
如果您需要纯正则表达式解决方案,并且您的正则表达式引擎支持环视,您可以尝试以下模式:
(?<=abc)\d+(?=def)
此图案表示:
(?<=abc)
断言abc
先于\d+
然后匹配一位或多位数字(?=def)
断言 def
跟在数字后面