正则表达式在最后一次匹配后不匹配文本

Posted

技术标签:

【中文标题】正则表达式在最后一次匹配后不匹配文本【英文标题】:Regex does not match text after last match 【发布时间】:2021-09-15 00:21:14 【问题描述】:

我正在尝试获取所有文本,但不是在内联代码 (`) 或代码块 (```) 中。我的正则表达式工作正常,但最后一个文本不匹配,我不知道为什么。

我当前的正则表达式:

(.*?)`1,3(?:.*?)`1,3(.*?)

你可以在这里查看结果:https://regex101.com/r/lYQnUJ/1/

也许有人知道如何解决这个问题。

【问题讨论】:

能否请您提及您正在寻找的正则表达式是哪种语言? 使用"(?s)```.*?```|`[^`]*`" 分割(参见demo,其中匹配项被替换为“---”行)。最后一部分不匹配,因为您的正则表达式末尾的 (.*?) 与任何文本都不匹配。如果你删除它,什么都不会改变。 @RavinderSingh13:对不起,我添加了 pcre 和 php 标签。 @WiktorStribiżew:你的意思是这样的:regex101.com/r/6aqtVC/1?不幸的是,它是一样的。最后的文本部分也不匹配。 :/ 感谢最后一组可以删除的提示。 print_r(preg_split('~```.*?```|`[^`]*`~s', $text))3v4l.org/2kO6K。输出是你期望的吗? 【参考方案1】:

你可以使用

preg_split('~```.*?```|`[^`]*`~s', $text)

详情

``` - 三重反引号 .*? - 尽可能少的零个或多个字符 ``` - 三重反引号 | - 或 ` - 一个反引号 [^`]* - 除反引号以外的零个或多个字符 ` - 一个反引号

参见regex 和PHP demo:

<?php

$text = 'your_text_here';
print_r(preg_split('~```.*?```|`[^`]*`~s', $text));

输出:

Array
(
    [0] => some text here

some more


    [1] => 

some 
    [2] =>  too

and more code blocks:



    [3] => 

this text isn't matched...
)

【讨论】:

以上是关于正则表达式在最后一次匹配后不匹配文本的主要内容,如果未能解决你的问题,请参考以下文章

仅匹配指定字符的最后一次出现的正则表达式

Linux学习-正则表达式与文本搜索

易语言正则表达式中,如何匹配多个关键词,例如我要在“你好我是地球人”中匹配“好”和“地”

正则表达式:匹配字符的第一次出现

正则表达式如何匹配多行的所有任意字符

js 正则获取匹配部分最后一个内容