我或多或少有以下几行:

$strings = [
  "Concepto de la transferencia    Un concepto uno        ",
  "Concepto traspaso    Orden #121231",
  "Concepto trasnferencia       121231 Magical Concept      ",
 ]


并具有以下正则表达式:

|Concepto\s+(?>de la )?(?>tr.+erencia|traspaso)\s+(?P<concepto>.+)$|


很好地捕获了每个字符串的结尾部分:

  "Un concepto uno        "
  "Orden #121231"
  "121231 Magical Concept       "


(包括尾随空格)。但是我希望该匹配项在存在尾随空格时将其排除。导致:

  "Un concepto uno"
  "Orden #121231"
  "121231 Magical Concept"


我试过了:

Concepto\s+(?>de la )?(?>tr.+erencia|traspaso)\s+(?P<concepto>.+)(?>\s+)?$


要么

Concepto\s+(?>de la )?(?>tr.+erencia|traspaso)\s+(?P<concepto>.+)\s*$


但是显然,这两个都不起作用。无法制作内联修饰符,例如(U)用于concepto组。

而且我知道我不能仅仅trim结果匹配并完成它。只想使此正则表达式工作。 :)

最佳答案

好吧,将最后一个.+转换为.+?(使用惰性量词),然后在\s*之前添加$

Concepto\s+(?>de la )?(?>tr.+erencia|traspaso)\s+(?P<concepto>.+?)\s*$
                                                                ^ ^^^


请参见regex demo

如果“概念”组可以为空,则将.+?替换为.*?。由于*? / +?是惰性的,因此将首先针对\s*进行测试,因此所有尾随空白符号都将在“概念”组之外。

同样,这里的原子团((?>))可以被单纯的非捕获((?:))基团取代。

10-07 18:03