我有一个字符串,我正在使用for循环进行解析。我想确定双/单引号的开头和结尾。下面,我举一个单引号的例子
var str = "a = 'hello \'world\''; b = 'test'";
var strInputArr = [];
var singleQuote = false;
var startIndex, endIndex;
var tmpStr = [];
for(var i = 0; i < str.length; i++) {
if(singleQuote) {
if(str[i] === "'") {
strInputArr.push(tmpStr.join(''));
tmpStr = [];
singleQuote = false;
endIndex = i;
}
tmpStr.push(str[i]);
continue;
}
if(str[i] === "'") {
singleQuote = true;
startIndex = i;
}
}
console.log(strInputArr);
上述代码的输出是
[“你好”,“'”,“'测试']
但它应该是
[“你好'世界'”,“测试”]
。如何获得预期的输出?
答案 0 :(得分:2)
您需要将代码更改为
var str = "a = 'hello \'world\''";
var singleQuote = false, hasLoggedStartIdx = false;
var startIndex, endIndex;
for(var i = 0; i < str.length; i++) {
if(singleQuote) {
if(str[i] === "'") {
singleQuote = false;
endIndex = i;
}
continue;
}
if(str[i] === "'") {
singleQuote = true;
if(hasLoggedStartIdx == false){
startIndex = i;
hasLoggedStartIdx = true;
}
}
}
console.log(startIndex+' - '+endIndex);
因为你每次都要覆盖startIndex,只是第一次写入它而不是下次写入
hasLoggedStartIdx
维持是否已写入
由于问题已更新,您可以按以下方式执行此操作
function getMatches(str){
let regex1 = /'(.*)';/g;
let regex2 = /'([^']*)'$/;
let result = [];
result = result.concat(regex1.exec(str)[1]);
result = result.concat(regex2.exec(str)[1]);
console.log(result);
}
getMatches("a = 'hello \'world\''; b = 'test'");
答案 1 :(得分:2)
var str = "a = 'hello \'world\''";
console.log(str.indexOf('\'')+' - '+str.lastIndexOf('\''));
当有非常简单的工具时,不要尝试复杂的东西:)。 indexOf
返回字符串(或数组)中的第一个匹配项,而lastIndexOf
返回最后一个...
答案 2 :(得分:1)
您应该将startIndex初始化为-1并更改代码如下:
var startIndex = -1;
...
if(str[i] == "'") {
singleQuote = true;
if (startIndex == -1)
startIndex = i;
}
...
希望这对你有所帮助。