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

yiv*_*ivi 2 php regex pcre

我或多或少有以下几行:

$strings = [
  "Concepto de la transferencia    Un concepto uno        ",
  "Concepto traspaso    Orden #121231",
  "Concepto trasnferencia       121231 Magical Concept      ",
 ]
Run Code Online (Sandbox Code Playgroud)

并有以下正则表达式:

|Concepto\s+(?>de la )?(?>tr.+erencia|traspaso)\s+(?P<concepto>.+)$|
Run Code Online (Sandbox Code Playgroud)

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

  "Un concepto uno        "
  "Orden #121231"
  "121231 Magical Concept       "
Run Code Online (Sandbox Code Playgroud)

(包括尾随空格).但是当我们存在时,我希望匹配排除尾随空格.导致:

  "Un concepto uno"
  "Orden #121231"
  "121231 Magical Concept"
Run Code Online (Sandbox Code Playgroud)

我试过了:

Concepto\s+(?>de la )?(?>tr.+erencia|traspaso)\s+(?P<concepto>.+)(?>\s+)?$
Run Code Online (Sandbox Code Playgroud)

要么

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

但显然没有工作.无法使内联修饰符Eg(U)适用于该concepto组.

我知道我不能trim完成比赛并完成比赛.只是想让这个正则表达式工作.:)

Wik*_*żew 5

好吧,将最后一个.+转为.+?(使用延迟量词)并在\s*之前添加$:

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

请参阅正则表达式演示

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

此外,(?>)这里的原子组()可以仅用非捕获((?:))组替换.