正则表达式、分组、查找最后匹配

4

I was hoping this regex

([A-Z]+)$ 

在这个例子中,会选择最后一次出现的情况:
AB.012.00.022ABC-1
AB.013.00.022AB-1
AB.014.00.022ABAB-1

但是我没有匹配结果。如果我去掉'$',我会得到:
AB and ABC
AB and AB
AB and ABAB

我只想要最后出现的 (ABC / AB / ABAB)。"AB." 不应该匹配。如何忽略它?类似 (^??.) 的东西。
3个回答

3
为了获取最后一个出现的内容,只需使用正向预查,告诉正则表达式引擎匹配末尾的最终符号:
([A-Z]+)(?=-\d+$)

你的正则表达式只是查找以大写字母A到Z结尾的字符串,但是AB.012.00.022ABC-1AB.013.00.022AB-1AB.014.00.022ABAB-1都没有以大写字母结尾(它们都以-1结尾)。如果你的字符串都以-1结尾,你可以使用(?=-1$)预查。

请参见演示


工作得很完美!但我必须研究一下那个正向先行是做什么的 :-) - Baked Inhalf
1
这里还有一个 :): ([A-Z]+)(?=[^A-Z]*$) - 它也会按照你的期望工作,因为它允许在结尾之前没有 A 到 Z 的字母。请参见 https://regex101.com/r/lY5jO0/2。 - Wiktor Stribiżew
奇怪的是,它不会忽略“AB。”,而是返回整个输入... 我不明白为什么([A-Z]+)^.不能工作。对我来说,它看起来像是“捕获A-Z组,后面没有跟着一个“.”... - Baked Inhalf
如果您不想捕获 AB.,则需要捕获其后面的内容并仅使用该捕获组:^AB\.(.*-\d)$。移动括号以获得所需的输出。如果您提供了精确的示例输入和输出 使用的编程语言,那么可能更容易向您展示一种解决方案。 - Wiktor Stribiżew
样本数据格式正确,我需要的是(ABC / AB / ABAB)。语言是Oracle SQL。 - Baked Inhalf
显示剩余2条评论

1
你可以使用元字符 \Z 表示字符串的绝对结尾。
要获取以 ABC / AB / ABAB 开头的最后一行,可以执行以下操作:
^((?:ABC|AB|ABAB)\.\S+)\Z

演示

对于以这些字母开头的字符串的最后一部分:

((?:ABC|AB|ABAB)-\d+)\Z

演示

如果你想在每行末尾加上一组:

(ABC|AB|ABAB)-\d+$    # with the M flag

演示


1
为了匹配字符串中最后一次出现的任何内容,您可以使用负向先行断言来匹配后面想要匹配的内容。这将类似于[A-Z]+(?!.*[A-Z]),其中[A-Z]被替换为您想要匹配的任何内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接