如何构建regexp以匹配可选模式



我有以下字符串示例:

MAREMMA TOSCANA BIANCO DOC 2020 CALASOLE MONTEMASSI0,750 
CHIANTI CLASSICO DOCG 2012 RISERVA ALBOLA LT.0,750

我需要分为5个部分(我将|放在以下样本中:

MAREMMA TOSCANA BIANCO DOC |2020| CALASOLE MONTEMASSI|0,750 
CHIANTI CLASSICO DOCG |2012| RISERVA ALBOLA |LT.|0,750

正如你所看到的,第四部分是可选的。

我在https://regex101.com/r/NX3DE3/1上尝试了这个正则表达式的一些变体,但LT.部分包含在前一部分中:

([A-Za-z ]+)((20dd)|(19dd))([A-Za-z ]*)((LT)).?[0-9,]*

((LT))组是可选的,但如果我添加?,它在第一个示例中运行,但在第二个示例中不运行,反之亦然。

我也想trim的不同部分,但真的不知道怎么做!

您可以使用

^(.*?)s*((?:20|19)dd)s*(.*?)(?:s+(LT)[. ])?(d[d,]*)

请参阅regex演示详细信息

  • ^-字符串的开头
  • (.*?)-第1组:除换行字符外的任何零个或多个字符,尽可能少
  • s*-零个或多个空白
  • ((?:20|19)dd)-第2组:2019,然后是两位数字
  • s*-零个或多个空白
  • (.*?)-第3组:除换行字符之外的任何零个或多个字符,尽可能少
  • (?:s+(LT)[. ])?-可选的非捕获组,匹配一个或多个空白,然后捕获到组4LT,然后捕获空间或.
  • (d[d,]*)-第5组:一个数字,然后是零个或多个数字或逗号

最新更新