2

我正在尝试创建一个正则表达式来匹配一个字符串<tag>something</tag>,我希望结果只返回something没有标签。

我尝试使用:

string.match(/(?<=<tag>).*?(?=<\/tag>)/g);

但它给出了一个错误:

SyntaxError:Invalid regular expression: /(?<=<tag>).*?(?=<\/tag>)/: Invalid group;

为什么它不工作?

4

3 回答 3

5

我想你会喜欢这个的

/(?:<(tag)>)((?:.(?!<\/\1>))+.)(?:<\/\1>)/g

正则表达式可视化

想象比赛,卢克!

这很方便,因为\1 反向引用匹配标签


在这样的文本上使用它

var re  = /(?:<(tag)>)((?:.(?!<\/\1>))+.)(?:<\/\1>)/g,
    str = "this is <tag>some text</tag> and it does <tag>matching</tag>",
    match;

while ((match = re.exec(str)) !== null) {
  console.log(match[1], match[2]);
};

输出

tag some text
tag matching

奖金苏打水!您可以简单地修改(tag)(tag|bonus|soda)让它在这个字符串上工作

<tag>yay</tag> and there's even <bonus>sodas</bonus> in <soda>cans</soda>

当心如果你嵌套标签,你将不得不递归地应用这个正则表达式。

于 2013-08-19T19:03:06.650 回答
0

看起来您正在尝试使用 JavaScript 不支持的lookbehind。您必须将模式更改为如下所示:

/<tag>(.*?)<\/tag>/g

然后提取相应的组。例如:

/<tag>(.*?)<\/tag>/g.exec('<tag>something</tag>')[1]; // something
于 2013-08-19T18:39:07.570 回答
0

尝试这个:

var result = /<tag>(.*?)<\/tag>/.exec(myString,"g");

之间的文本然后在结果 [1] 中。

于 2013-08-19T18:45:28.870 回答