【问题标题】:Sublime Text regex not detecting multiline tagsSublime Text 正则表达式未检测到多行标签
【发布时间】:2014-11-25 06:53:29
【问题描述】:

我这里有这个正则表达式;

\[sometag\](.*)\[/sometag\]

应该捕获被[sometag] 标记包围的文本。它适用于这些标签中包含的单行信息,例如字符串[sometag]this is a bit of text[/sometag]。但它不适用于像这样跨越多行的文本;

[sometag] here is more text

it spans more than one line [/sometag]

由于某种原因,Sublime 文本的正则表达式查找器无法识别多行的标签。我想知道这是 Sublime Text 的问题、可切换的选项,还是我个人对正则表达式的无能。

【问题讨论】:

    标签: regex tags sublimetext


    【解决方案1】:

    在开始时,使用 dotall 修饰符 (?s) 使 dot 也匹配换行符。

    (?s)\[sometag\](.*?)\[\/sometag\]
    

    DEMO

    【讨论】:

    • 谢谢!为什么我必须包含这些额外的问号?
    • ?* 之后将进行非贪婪匹配。以[b]foo[/b]foo[b]bar[/b] 为例。 \[b\].*\[\/b\] 将匹配从开始 b 到最后结束 b 的整体。
    • 只是在这个regex101.com/r/gI0xC3/2中添加和删除?
    • (?s) 使点也包含换行符
    【解决方案2】:

    如果由于某些原因不允许修改点的模式,您可以这样:

    [sometag](.|\n)+?[/sometag]
    

    【讨论】:

    • 如果您有权访问 DOTALL 修饰符,切勿使用 (.|\n)+?。如果您不能使用(?s),请使用[\s\S]/[\d\D]/[\w\W],但不要使用此处建议的交替模式。这种模式效率极低,很容易导致超时问题。
    • @WiktorStribiżew:你能解释一下为什么它效率低吗?我总是使用[\s\S],但乍一看(.|\n) 似乎等效?是否与匹配组有关?但是(?:.|\n) 会是一样的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多