捕获行尾字符串但避免捕获匹配的尾随字符

capture end of line string but avoid capturing matching trailing characters

我或多或少有以下几行:

$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       "

(包括尾随空格)。但我希望匹配 exclude 尾随空格(当它们存在时)。结果:

  "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

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

此外,这里的原子团 ((?>)) 可以仅替换为 non-capturing ((?:)) 个原子团。