JavaScript正则表达式匹配[[quote][/quote]]

JavaScript正则表达式匹配[[quote][/quote]],javascript,regex,Javascript,Regex,我正在尝试获取[[quote=bob]这是bob写的一些文本[/quote]] 我使用的是: 匹配(/[[quote=(.*?)(.*?][quote]]/)[1] 但是它在这里给了我一些文本这是鲍勃写的一些文本试试这个: var quote = 'some text here [[quote=bob]This is some text bob wrote[/quote]] other text here'; 试试这个: var quote = 'some text here [[quote=

我正在尝试获取
[[quote=bob]这是bob写的一些文本[/quote]]

我使用的是:
匹配(/[[quote=(.*?)(.*?][quote]]/)[1]

但是它在这里给了我一些文本这是鲍勃写的一些文本试试这个:

var quote = 'some text here [[quote=bob]This is some text bob wrote[/quote]] other text here';
试试这个:

var quote = 'some text here [[quote=bob]This is some text bob wrote[/quote]] other text here';

这里的问题是,
[
是正则表达式中的保留字符,因此必须对其进行转义才能将其用作“正则”字符

这是一个开始,它将匹配变量quote中的[quote=bob]

quote.match(/\[quote=[a-z]*\]/)

这是完整、正确和安全的版本

var quote = 'some text here [[quote=bob]This is some text bob wrote[/quote]] other text here';

console.log( quote.match(/(\[\[quote=(.*?)\](.*?)\[\/quote\]\])/) );
// [1] => "[[quote=bob]This is some text bob wrote[/quote]]"
// [2] => "bob"
// [3] => "This is some text bob wrote"
它将返回正确的字符串,包括周围的[quote]标记作为第一个结果,仅返回内部字符串作为第二个结果


我还使用了[a-z]字符类,因为您不想在
=
字符之后匹配任何内容。

这里的问题是
[
是正则表达式中的保留字符,因此必须对其进行转义才能将其用作“正则”字符

这是一个开始,它将匹配变量quote中的[quote=bob]

quote.match(/\[quote=[a-z]*\]/)

这是完整、正确和安全的版本

var quote = 'some text here [[quote=bob]This is some text bob wrote[/quote]] other text here';

console.log( quote.match(/(\[\[quote=(.*?)\](.*?)\[\/quote\]\])/) );
// [1] => "[[quote=bob]This is some text bob wrote[/quote]]"
// [2] => "bob"
// [3] => "This is some text bob wrote"
它将返回正确的字符串,包括周围的[quote]标记作为第一个结果,仅返回内部字符串作为第二个结果


我还使用了[a-z]字符类,因为您不想匹配
=
字符后面的任何内容。

quote.match(/\[\[quote=(.*?)(.*?\[\/quote]/)[0]
请注意。如果您的语言足够复杂,它可能也适用于您的情况。@Oriol-我在该字符串中没有看到任何HTML。@j08691是的,但这似乎与HTML非常接近。我只是想警告一下,以防万一。同样的警告也适用于bbcode。将括号从斜角改为方括号不会改变语法复杂度属性。
quote.match(/\[\[quote=(.*?)(.*?)\[\/quote]]/)[0]
请注意。如果您的语言足够复杂,它可能也适用于您的情况。@Oriol-我在该字符串中没有看到任何HTML。@j08691是的,但这似乎与HTML非常接近。我只是想警告一下,以防万一。同样的警告也适用于bbcode。将括号从斜角改为方括号不会改变语法复杂度如我在回答中所述,在这里使用
*
是不安全的。Regex将找到可能的最长匹配,因此使用不同的字符串我会得到不好的结果:
'这里有一些文本[[quote=bob]这是bob写的一些文本[quote]]这里有一些文本[/quote]]'。匹配(/.[\[\[\[\[\[\[quote=.\]].].].\[\/]);
给出:
[]这里有一些文本[这是鲍勃写的一段文字,“[[quote=bob]这是鲍勃写的一段文字”]
@Johnride
*
是这样做的,而不是
*?
。这是我不知道的。
+
*
转换为非贪婪匹配。很好。这里请接受我的投票。这在嵌套引号上仍然失败,例如:“[[quote=foo]这里有一些文本[[quote=bob]这是bob写的一些文本[/quote]]这里有其他文本[/quote]](请参阅一个实例)@JesseWatZ然后它就变得不那么严格了。需要使用递归backrefs或类似的东西。我喜欢正则表达式,这是一个不断改进和学习的世界。我的使用嵌套引号会更好一些,但必须递归地删除上一个匹配项。如果引号包含[尽管如此。如我在回答中所述,在这里使用
*
是不安全的。Regex将找到可能的最长匹配,因此使用不同的字符串我会得到不好的结果:
'这里的一些文本[[quote=bob]这是bob写的一些文本[quote]]这里的其他文本[/quote]]'。匹配(/.[\[\[\[quote=.\]..[\[\/quote\]\]]]./);
给出:
[“这里有一些文字[[quote=bob]这是bob写的一些文字[quote]”,“[[quote=bob]这是bob写的一些文字[quote]”]
@Johnride
*
是这样做的,而不是
*?
。这是我不知道的。
+
*
转换为非贪婪匹配。很好。这里请接受我的投票。这在嵌套引号上仍然失败,例如:“[[quote=foo]这里有一些文本[[quote=bob]这是bob写的一些文本[/quote]]这里有其他文本[/quote]](请参阅一个实例)@JesseWatZ然后它就变得不那么严格了。需要使用递归backrefs或类似的东西。我喜欢正则表达式,这是一个不断改进和学习的世界。我的使用嵌套引号会更好一些,但必须递归地使用它来删除前一个匹配项。如果引号包含[Through],我的将失败。