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

时间:2017-01-26 14:09:57

标签: php regex pcre

我或多或少有以下几行:

$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结果匹配并完成它。只是想让这个正则表达式工作。 :)

1 个答案:

答案 0 :(得分:5)

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

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

请参阅regex demo

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

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