正则表达式,分组,找到最后一场比赛

时间:2015-04-20 20:46:31

标签: 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 个答案:

答案 0 :(得分:3)

要获得最后一次出现,只需使用正向预测即可告诉正则表达式引擎匹配最后的最终符号:

([A-Z]+)(?=-\d+$)

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

请参阅demo

答案 1 :(得分:1)

要匹配最后一次出现的任何内容,您可以使用与后面的字符串匹配的负前瞻。这看起来像[A-Z]+(?!.*[A-Z]),其中[A-Z]将替换为您想要匹配的任何内容。

答案 2 :(得分:1)

您可以使用\Z这是字符串元字符的绝对结尾。

要获得以ABC / AB / ABAB开头的最后一行,您可以:

^((?:ABC|AB|ABAB)\.\S+)\Z

Demo

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

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

Demo

如果您希望每一行末尾的每一组:

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

Demo