从右边而不是左边开始拍摄

  • 本文关键字:开始 左边 右边 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-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]+)?

最新更新