从右侧而不是左侧开始捕捉

时间:2021-06-29 15:04:26

标签: regex

我有以下 RE 需要从字符串的末尾开始匹配。

字符串:

AAA. A ZZZ-X37

AAA 4X X9 A ZZZ-X37

AAA 4X A ZZZ-X37

回复:

^(?<g1>\s?[a-zA-Z\.]*)(?<g2>\s?[a-zA-Z\d]*)?(?<g3>\s?[a-zA-Z\d]*)?(?<g4>\s?[a-zA-Z]*)(?:\s?(?P<CAPT1>[A-Z]*)(?:-)?(?P<CAPT2>[\w\d]*)(?:-.{2})?)$

CAPT1 需要在所有情况下捕获 ZZZ,但在示例 #1 和 #3 中它没有得到它。 我尝试将 g2 和 g3 组设为可选,但似乎没有什么区别。

我现在的想法是从字符串的末尾开始匹配,这样可以首先捕获我需要的内容,但是如果 g2 和 g3 都可以是可选的,那么我更喜欢它。

1 个答案:

答案 0 :(得分:1)

您可以重构模式以使可选组中的模式成为必需的:

^(?<g1>\s*[a-zA-Z.]+)(?<g2>\s+[a-zA-Z\d]+)?(?<g3>\s+[a-zA-Z\d]+)?(?<g4>\s?[a-zA-Z]*)(?:\s+(?P<CAPT1>[A-Z]+)-(?P<CAPT2>\w+)(?:-.{2})?)$

参见regex demo

基本上,您可以使用 (x?a*)?(x?a*),而不是一连串的 (x+a+)? 等。例如,(?<g2>\s?[a-zA-Z\d]*)? 变成 (?<g2>\s+[a-zA-Z\d]+)? 以确保这部分与 (?<g1>\s*[a-zA-Z.]+) 匹配的部分不同,即它们不能在字符串中的相同位置匹配。

我保持 (?<g4>\s?[a-zA-Z]*) 不变,但如果您还有其他问题,请遵循相同的逻辑,并将其替换为 (?<g4>\s+[a-zA-Z]+)?