我有以下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-Zd]*)?(?<g3>s?[a-zA-Zd]*)?(?<g4>s?[a-zA-Z]*)(?:s?(?P<CAPT1>[A-Z]*)(?:-)?(?P<CAPT2>[wd]*)(?:-.{2})?)$
CAPT1需要在所有情况下捕获ZZZ,但在示例#1和#3中,它没有得到它。我试着让g2组和g3组可选,但似乎没有什么不同。
我现在的想法是从字符串的末尾开始匹配,这样可以首先捕获我需要的内容,但如果g2和g3都是可选的,那么我更喜欢它
您可以重构模式,使可选组中的模式成为强制性的:
^(?<g1>s*[a-zA-Z.]+)(?<g2>s+[a-zA-Zd]+)?(?<g3>s+[a-zA-Zd]+)?(?<g4>s?[a-zA-Z]*)(?:s+(?P<CAPT1>[A-Z]+)-(?P<CAPT2>w+)(?:-.{2})?)$
请参阅regex演示。
基本上,您可以使用(x+a+)?
,而不是使用(x?a*)?(x?a*)
等链。例如,(?<g2>s?[a-zA-Zd]*)?
转换为(?<g2>s+[a-zA-Zd]+)?
,以确保该部分与(?<g1>s*[a-zA-Z.]+)
匹配的部分不同,即,它们不能在字符串中的同一位置匹配。
我保持了(?<g4>s?[a-zA-Z]*)
的完整性,但如果您有其他问题,请遵循相同的逻辑,并将其替换为(?<g4>s+[a-zA-Z]+)?
。