【问题标题】:capture end of line string but avoid capturing matching trailing characters捕获行尾字符串,但避免捕获匹配的尾随字符
【发布时间】:2017-01-26 14:09:57
【问题描述】:

我或多或少有以下几行:

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

【问题讨论】:

    标签: php regex pcre


    【解决方案1】:

    好吧,把最后一个.+变成.+?(使用惰性量词)并在$之前添加\s*

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

    regex demo

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

    此外,此处的原子组 ((?&gt;)) 可以替换为单纯的非捕获 ((?:)) 组。

    【讨论】:

    • 你回答得越快,我就觉得自己越笨。 :P 非常感谢 :)
    猜你喜欢
    • 2021-09-30
    • 2015-07-16
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多