【发布时间】:2021-04-16 05:20:19
【问题描述】:
给定下面的字符串,
ay bee ceefooh deefoo38 ee 37 ef gee38 aitch 38 eye19 jay38 kay 99 el88 em38 en 29 ou38 38 pee 12 q38 arr 999 esss 555
目标是匹配每个单词,使得后缀是一个与出现在foo 之后的数字相匹配的数字(在这种情况下恰好是 38)。
只有一个子字符串以foo 开头并以数字结尾。预期的匹配都存在于所述子字符串之后。
预期匹配:
gee38
jay38
em38
ou38
q38
我尝试了foo(\d+).*?(\w+\1)\b 和foo(\d+).*(\w+\1)\b,但它们无法匹配所有,因为它们要么匹配第一个 (gee38) 要么匹配最后一个 (q38)。
是否有可能只用一个正则表达式匹配所有内容,更重要的是,只需一次运行?
我使用的 PCRE2 引擎的行为方式与 https://regex101.com/r/uFEDOE/1 相同。所以,如果正则表达式可以匹配 regex101 上的多个子字符串,那么我使用的引擎也可以。
【问题讨论】:
-
您是否总是将“foo”作为具有此后缀的第一个单词?或者是否有实例在以“foo”结尾的单词之前有这个后缀?
-
@Thefourthbird 仅在
foo38之后。对不起,我误解了你的问题。 -
这个正则表达式可能会有所帮助:
(?:foo|\G(?!^))(\d+).*?(?=(\w+))\w+(?=\1\b) -
@Michail 太棒了,你可以把它贴出来。我认为如果你在非贪婪匹配之后添加一个单词边界,并在前瞻中使用反向引用,你可以减少步骤数。
(?:foo|\G(?!^))(\d+).*?\b(?=(\w+\1))\w+(?=\1)regex101.com/r/T8dmDq/1 -
@第四只鸟您的正则表达式大约快 x2 并且很棒。不幸的是,我不确定像
ab38cd这样的东西是合法的输出
标签: regex pcre backreference