确定报价的开头和结尾

时间:2017-09-08 09:32:57

标签: javascript string

我有一个字符串,我正在使用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);

上述代码的输出是

  

[“你好”,“'”,“'测试']

但它应该是

  

[“你好'世界'”,“测试”]

。如何获得预期的输出?

3 个答案:

答案 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;
}

...

希望这对你有所帮助。