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

标签 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 小组工作。

而且我知道我不能只是修剪结果匹配并完成它。只是想让这个正则表达式起作用。 :)

最佳答案

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

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

请参阅regex demo

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

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

关于php - 捕获行尾字符串,但避免捕获匹配的尾随字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41875348/

相关文章:

javascript - Yii2 + AngularJS PrettyURL 启用工作

javascript - 如何在句号后用逗号分隔单词

MySQL 用可变数字搜索/替换

C LibPCRE TRUE/FALSE 问题

php - 使用 php 的 windows 套接字有什么区别?

php - 如何在同一个 Doctrine2 对象上正确插入或更新

php - 使用 Ajax 加载内容时遇到问题

javascript - 正则表达式文本替换使用 |和 () 捕获问题

php - 如何在 PHP 中获取正则表达式 (PCRE) 的结束位置?

regex - 我可以执行 'non-global' grep 并仅捕获为每行输入找到的第一个匹配项吗?