我有大量数据需要使用JavaScript提取双引号括起来的最后一个字符串。每个文本都如下所示:
有些文字有些文字有些文字“有些引用”有些文字
或者这个
有些文字“引用”一些文字“和一些引用”
或者为什么不喜欢这个
有些文字“有些文字”有些引用“有些文字
等等。
正如您所看到的,问题在于缺乏数据集的可预测性,我无法解决这个问题。 我的进步只能提取第一个保证:
$( $("[id^=node-]") ).each(function() {
var string = $(this).next().text();
array = string.match(/"([^"]+)"/);
});
答案 0 :(得分:2)
您可以在模式后使用正向前瞻(?=[^"]*$)
,以确保只匹配最后一对引号:
var s = ["some text some text some text \"some quote\" some text", "Some text \"some quote\" some text \"and some quote\"", "Some text \" some text \"some quote\" some text"];
var res = s.map(r => (m = r.match(/"([^"]*)"(?=[^"]*$)/)) ? m[1] : "");
document.body.innerHTML = "<pre>" + JSON.stringify(res, 0, 4) + "</pre>";
这是regex demo。
模式细分:
"
- 匹配双引号([^"]*)
- 匹配并捕获双引号之间的内容,因为[^"]*
匹配除双引号之外的任何0+字符"
- 双引号(?=[^"]*$)
- 如果在最后一个匹配的"
右侧某个地方有一个双引号,直到字符串的结尾(换句话说,不需要"
),则匹配失败直到字符串的结尾)。对于那些认为前瞻是一种矫枉过正的人来说,另一个正在使用的正则表达式应该是
/"([^"]*)"[^"]*$/
var s = ["some text some text some text \"some quote\" some text", "Some text \"some quote\" some text \"and some quote\"", "Some text \" some text \"some quote\" some text"];
var res = s.map(r => (m = r.match(/"([^"]*)"[^"]*$/)) ? m[1] : "");
document.body.innerHTML = "<pre>" + JSON.stringify(res, 0, 4) + "</pre>";
说明是相同的,但是前瞻变成了一个消费子模式[^"]*$
,它实际上匹配(并消耗字符)除"
之外的所有0+符号,直到字符串结尾。
答案 1 :(得分:1)
答案 2 :(得分:1)
如果正则表达式不是授权,请尝试
var someText = 'some text some text some text "some quote" some text';
var matchedItems = someText.split("\"").filter(function(value,index){if (index%2==1) return true});
var someText = 'Some text "some quote" some text "and some quote"';
var matchedItems = someText.split("\"").filter(function(value,index){if (index%2==1) return true});
document.body.innerHTML += JSON.stringify(matchedItems, 0, 4);
&#13;
答案 3 :(得分:0)
对于某些人来说,前瞻是他们试图在每个钉子上砸的锤子。
查找最后引用的字符串:
/"([^"]*)"[^"]*$/
^^^^^^^^^ STRING WITH QUOTES
^^^^^ STRING WITHOUT QUOTES (CAPTURING THIS)
^^^^^ OTHER STUFF WITHOUT QUOTES
^ END OF STRING