我有以下 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 都可以是可选的,那么我更喜欢它。
答案 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]+)?
。