【问题标题】:Matching pattern in a text using regular expressions使用正则表达式匹配文本中的模式
【发布时间】:2016-12-07 18:56:26
【问题描述】:

使用正则表达式匹配模式的最后一次出现

关于以下文字:

commit 5a254a0bfc0232bd838157cada953f87a7b6ffad
Merge: 2b9fcd8 a9b214e
Author: Peter Pan <peterpan@gmail.com>
Date:   Wed Dec 7 11:54:08 2016 -0500

    Merge branch 'master' of github.com:peterpan/testing

commit 2b9fcd8c10ee18ad2ea88190a3b10cc8affd4093
Author: Peter Pan <peterpan@gmail.com>
Date:   Wed Dec 7 11:53:51 2016 -0500

    KWP245

commit a9b214eb476e3d1f3896db31125d6e8108dca06d
Author: Peter Pan <peterpan@gmail.com>
Date:   Wed Dec 7 10:52:40 2016 -0600

    QZN0O5

commit a6be0abd17d3d6b1fdfe0711fe8e41a28b092212
Author: Peter Pan <peterpan@gmail.com>
Date:   Wed Dec 7 10:52:38 2016 -0600

    QZN0O5

[编辑 1]

下面的文字我觉得比较笼统:

commit 5a254a0bfc0232bd838157cada953f87a7b6ffad
Merge: 2b9fcd8 a9b214e
Author: Peter Pan <peterpan@gmail.com>
Date:   Wed Dec 7 11:54:08 2016 -0500

    Merge branch 'master' of github.com:peterpan/testing

commit 2b9fcd8c10ee18ad2ea88190a3b10cc8affd4093
Author: Peter Pan <peterpan@gmail.com>
Date:   Wed Dec 7 11:53:51 2016 -0500

    KWP245

commit a9b214eb476e3d1f3896db31125d6e8108dca06d
Author: Peter Pan <peterpan@gmail.com>
Date:   Wed Dec 7 10:52:40 2016 -0600

    QZN0O5

commit a6be0abd17d3d6b1fdfe0711fe8e41a28b092212
Author: Peter Pan <peterpan@gmail.com>
Date:   Wed Dec 7 10:52:38 2016 -0600

    QZN0O5

commit bb2762bd17d3d6b1fdfe0711fe8e41a28b092212
Author: Peter Pan <peterpan@gmail.com>
Date:   Wed Dec 7 10:52:38 2016 -0600

    H82LKJ

commit aa72dfeb476e3d1f3896db31125d6e8108dca06d
Author: Peter Pan <peterpan@gmail.com>
Date:   Wed Dec 7 10:52:40 2016 -0600

我想从提交词中捕获带有“QZN0O5”的最后一个文本块。

commit a9b214eb476e3d1f3896db31125d6e8108dca06d
Author: Peter Pan <peterpan@gmail.com>
Date:   Wed Dec 7 10:52:40 2016 -0600

    QZN0O5

我的意思是第一次提交带有文本QZN0O5

我试过了:

preg_match("/(?<!commit).*?QZN0O5/is", $text, $matches);

但没有成功。

实际上我想捕获提交代码:a9b214eb476e3d1f3896db31125d6e8108dca06d 更具体。如果您对此有解决方案,那就更好了。

知道如何匹配该文本吗?

【问题讨论】:

  • 全部匹配,得到数组的最后一项。
  • 我只得到一个大火柴而不是多个小火柴。

标签: php regex preg-match preg-match-all


【解决方案1】:

您可以将以下正则表达式与preg_match_all 一起使用并获取最后一项:

/^\s*QZN0O5\s*(.*\R.*\R.*+)(?!(?s:.*^\s*QZN0O5))/m

或者 - 或者:

/^\h*QZN0O5\s*(.*+(?:\R(?!\R).*)*+)(?![\s\S]*?^\h*QZN0O5$)/m

请参阅 regex demoregex demo 2

详情

  • ^ - 行开始
  • \s* - 0 个或多个空格
  • QZN0O5 - 你需要找到的代码
  • \s* - 0+ 个空格
  • (.*\R.*\R.*+) - 3 行...
  • (?!(?s:.*^\s*QZN0O5))- 但后面没有任何 0+ 个字符(内联修饰符组 (?s:....) 也使 . 匹配换行符)后跟一个行开头、0+ 个空格和您需要匹配的代码)
  • $ - 行尾

第二个正则表达式类似,但(.*+(?:\R(?!\R).*)*+) 部分只是使正则表达式匹配直到双换行符。

PHP demo

$re = '/^\h*QZN0O5\s*(.*+(?:\R(?!\R).*)*+)(?![\s\S]*?^\h*QZN0O5$)/m';
$str = "commit 5a254a0bfc0232bd838157cada953f87a7b6ffad\r\nMerge: 2b9fcd8 a9b214e\r\nAuthor: Peter Pan <peterpan@gmail.com>\r\nDate:   Wed Dec 7 11:54:08 2016 -0500\r\n\r\n    Merge branch 'master' of github.com:peterpan/testing\r\n\r\ncommit 2b9fcd8c10ee18ad2ea88190a3b10cc8affd4093\r\nAuthor: Peter Pan <peterpan@gmail.com>\r\nDate:   Wed Dec 7 11:53:51 2016 -0500\r\n\r\n    KWP245\r\n\r\ncommit a9b214eb476e3d1f3896db31125d6e8108dca06d\r\nAuthor: Peter Pan <peterpan@gmail.com>\r\nDate:   Wed Dec 7 10:52:40 2016 -0600\r\n\r\n    QZN0O5\r\n\r\ncommit a6be0abd17d3d6b1fdfe0711fe8e41a28b092212\r\nAuthor: Peter Pan <peterpan@gmail.com>\r\nDate:   Wed Dec 7 10:52:38 2016 -0600\r\n\r\n    QZN0O5\r\n\r\ncommit bb2762bd17d3d6b1fdfe0711fe8e41a28b092212\r\nAuthor: Peter Pan <peterpan@gmail.com>\r\nDate:   Wed Dec 7 10:52:38 2016 -0600\r\n\r\n    H82LKJ\r\n\r\ncommit aa72dfeb476e3d1f3896db31125d6e8108dca06d\r\nAuthor: Peter Pan <peterpan@gmail.com>\r\nDate:   Wed Dec 7 10:52:40 2016 -0600";
preg_match_all($re, $str, $matches);
echo end($matches[1]);

【讨论】:

  • 我尝试了其他示例文本,但没有成功。我在前一个文本下方发布了其他文本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-05
  • 2013-06-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多