【问题标题】: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。输出是你期望的吗?

标签: php regex pcre


【解决方案1】:

你可以使用

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

详情

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

参见regexPHP 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...
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    • 2015-04-29
    相关资源
    最近更新 更多