【问题标题】:Regex - match any text between some delimiters正则表达式 - 匹配某些分隔符之间的任何文本
【发布时间】:2015-10-29 17:47:56
【问题描述】:

我试图抓住这个字符串[[....]](包括括号)

其中.... 可以是除]] 之外的任何内容(包括不可打印)

这里是匹配的来源:

var myString = 'blablablabla[["<strong>LA DEFENSE 4 TEMPS ( La Rotonde )</strong><br />Centre commercial LES 4 TEMPS",
                         48.89141725,
                         2.23478235,
                         "4T"],
    ["<strong>ANGERS</strong><br />Centre commercial GEANT",
                         48.89141725,
                         2.23478235,
                         "4T"]]blablablabla'

我尝试使用这种方法[^\]]+ 来匹配除双括号之外的所有字符/非字符。我遇到的问题是我不知道如何将此方法与紧接在第一个括号[^\]\]]+ 之后的括号一起使用。

有没有正/负前瞻或单词边界的解决方案?

(\[\[[^\](?=\])]+)

Debuggex Demo

有什么帮助吗?

【问题讨论】:

  • 你可以使用/\[\[[\s\S]*?\]\]/

标签: javascript regex


【解决方案1】:

在 JavaScript 中,要匹配包含多个字符的某些分隔符之间的任何文本,最好使用带有惰性量词的 [^]/[\s\S]/[\d\D]/[\w\W] 构造(*? 匹配0 次或多次出现,或 +? 匹配 1 次或多次出现的前述子模式,但尽可能少地返回有效匹配)。

虽然 [^] 构造匹配任何字符(包括换行符)是 JavaScript 特有的,但 [\s\S] 及其变体大多是跨平台构造,可在 PCRE、.NET、Python、Java 等中工作。[...] 中这种情况是一个包含两个相反简写类的字符类。因为\s 匹配所有空白字符,\S 匹配所有非空白字符,所以这个[\s\S] 匹配任何输入中的any 符号。

我建议避免使用(.|\n)。这种结构会导致更多的回溯步骤发生并减慢正则表达式搜索。

所以,你可以使用

\[\[[\d\D]*?]]

JS regex demo

这是一个代码sn-p:

var re = /\[\[[\d\D]*?]]/g; 
var str = 'blablablabla[["<strong>LA DEFENSE 4 TEMPS ( La Rotonde )</strong><br />Centre commercial LES 4 TEMPS",\n                         48.89141725,\n                         2.23478235,\n                         "4T"],\n    ["<strong>ANGERS</strong><br />Centre commercial GEANT",\n                         48.89141725,\n                         2.23478235,\n                         "4T"]]blablablabla';
var m;
 
while ((m = re.exec(str)) !== null) {
    console.log(m[0]);
}

更新

在这种情况下,当分隔符不同且仅包含 2 个字符时,您可以使用一种技术来匹配除关闭分隔符的第一个符号以外的所有字符,然后匹配整个关闭分隔符的 0 个或多个序列,然后结束分隔符中除第一个符号以外的任何符号出现 1 次或多次。

\[\[[^\]]*(?:][^\]]+)*]]

regex demo

这个正则表达式的线性特性使它非常快。

附:我还想指出,您不需要在 JS 正则表达式的字符类之外转义 ],但它必须在字符类中转义 - 总是。

【讨论】:

  • 感谢您的解决方案/解释@stribizhev
  • [\s\S]/[\d\D]/[\w\W] 是什么意思?
  • 我在字符类中添加了对相反速记类概念的解释。
【解决方案2】:

试试这个:

\[\[(.|\n)*?\]\]

https://regex101.com/r/gR5oJ3/1

它应该匹配介于 [[ ]] 之间的任何内容。主要问题是处理换行符(.|\n) 部分将匹配任何包括换行符

【讨论】:

    猜你喜欢
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    • 2019-05-09
    • 2023-04-10
    • 2017-02-16
    • 1970-01-01
    • 2019-03-21
    相关资源
    最近更新 更多