将字符串拆分为;只要它's不在»«

Split a string by ; as long as it's not between » «

本文关键字:不在 #171 #187 拆分 字符串      更新时间:2023-09-26

尽管标题不言自明,但我会稍微描述一下这个问题。

所以我想用;来分割一个字符串。但是,如果;位于这两个字符» «之间,则不要将其拆分。当然,一个字符串中可以有多个» «

此:var myString = "Split this; »Don't split this; don't split«; split this again; this is split";

应返回:["Split this", "»Don't split this; don't split«", "split this again", "this is split"]

我想这可以用regex解决,但我还没有运气。

以下是让我们开始的代码:http://jsbin.com/wivuyucifo/1/edit?html,js,控制台

我会将其标记为重复,因为我刚刚从另一个StackOverflow答案中提取了以下regex代码(请参阅:javascript/regex忽略双引号中的分号),但是,以下答案应该有助于解释如何将该答案转换为具有不同起始/结束引号的答案。

var myString = "Split this; »Don't split this; don't split«; split this again; this is split";
var regex = /(?!;|$)[^;»]*((»[^«]*«)[^;»]*)*/g;
var results = myString.match(regex);
document.write(JSON.stringify(results));

如果你不必担心嵌套的guilemets,你可以使用一个非常简单的算法,如下所示:

var myString = "Split this; »Don't split this; don't split«; split this again; this is split";
console.log(mySplit(myString));
function mySplit(input) {
  let result = [];
  let isQuoted = false;
  let temp = "";
  
  for(let i=0; i < input.length; i++) {
    let c = input[i];
    switch (c) {
      case "»":
        temp += c;
        isQuoted = true;
        break;
      case "«":
        temp += c;
        isQuoted = false;
        break;
      case ";":
        if (isQuoted) {
          temp += c;
        } else {
          result.push(temp);
          temp = "";
        }
        break;
      default:
        temp += c;
        break;
    }
  }
  result.push(temp);
  return result;
}