正则表达式 - 匹配某些分隔符之间的任何文本

时间:2015-10-29 17:47:57

标签: javascript regex

我尝试捕获此字符串[[....]](包括括号)

其中....可以是任何内容(包括不可打印的),但]]

除外

以下是匹配的来源:

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'

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

是否存在正/负前瞻或字边界的解决方案?

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

Regular expression visualization

Debuggex Demo

请帮忙吗?

2 个答案:

答案 0 :(得分:2)

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

虽然[^]构造匹配任何字符(包括换行符)都是特定于JavaScript的,[\s\S]及其变体主要是跨平台构造,可在PCRE,.NET,Python,Java等中使用。在这种情况下,[...]是一个包含两个相反的速记类的字符类。由于\s匹配所有空白字符,\S匹配所有非空白字符,因此[\s\S]匹配任何输入中的任何符号。

我建议您不要使用(.|\n) 。此构造会导致更多的回溯步骤发生,并减慢正则表达式搜索速度。

所以,你可以使用

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

请参阅JS regex demo

以下是代码段:

&#13;
&#13;
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]);
}
&#13;
&#13;
&#13;

<强>更新

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

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

请参阅regex demo

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

P.S。我还要注意,你不需要在JS regex中转义字符类之外的],但它必须在字符类中转义 - 总是。

答案 1 :(得分:1)

试试这个:

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

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

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