javascript - 如何在旧版 IE 中使用 String.split 捕获组?

标签 javascript regex split internet-explorer-7

var textt = "L'architecture du système d'information devient";
var pattern = "/(ARCH)/gi";
var array = textt.split(pattern);
console.log(array)

这会导致:

[
    L',
    itecture du système d'information devient
]

预期结果是:

[
    L',
    arch,
    itecture du système d'information devien
]

另一个例子

var textt = "ARCHIMAG";
var pattern = "/(ARCH)/gi";
var array = textt.split(pattern);
console.log(array)

结果:

[
    IMAG
]

预期是:

[
    ARCH,
    IMAG
]

最佳答案

如果您可以进行功能测试并使用功能来替换非捕获拆分,请尝试以下操作。它在加载脚本时测试支持情况,并为 nonCaptureSplit 分配适当的函数,因此测试仅进行一次。

如果您使用字母字符或数字以外的任何内容(例如,如果字符串中有标点符号),则需要对模式进行转义。

已编辑

如果缺乏对非捕获分割的支持,现在会进行完全手动分割。

// Do case insensitive, non-capture split
var nonCaptureSplit = (function() {

  // Feature test for non-capturing split
  if ( 'ab'.split(/(a)/).length == 3) {
    return function (str, pattern) {
      var re = new RegExp('(' + pattern + ')','i');
      return str.split(re);
    };

  // Otherise, do it with a function
  } else {
    return function(str, pattern) {

      // Do case insensitive split
      var result = [];
      var ts = str.toLowerCase(); // copy of string in lower case
      var tp = pattern.toLowerCase();
      var first = true;

      while (ts.indexOf(tp) != -1) {
        var i = ts.indexOf(tp);

        // If first match is at the start, insert empty string + pattern
        // Trim pattern from front of temp strings
        if (i == 0 && first) {
          result.push('', pattern);
          ts = ts.substring(tp.length);
          str = str.substring(tp.length);

        // If match is at the end, append pattern and ''
        // Set temp string to '' (i.e. finished)
        } else if (i == ts.length - tp.length) {
          result.push(str.substr(0,i), pattern);
          ts = '';
          str = '';

        // Otherwise, append the next unmatched part
        // and pattern
        } else {
          result.push(str.substring(0,i), pattern);
          ts = ts.substring(i + pattern.length);
          str = str.substring(i + pattern.length);

        }
        first = false;
      }

      // Append remainder of string or '' if used, i.e. last match
      // must have been at end of string
      result.push( ts.length? str : '');

      return result;

    };
  }
}());

测试:

alert(nonCaptureSplit('wa', 'wa'));        // ,wa,
alert(nonCaptureSplit('qwqwaba', 'wa'));   // qwq,wa,ba
alert(nonCaptureSplit('qwqwaba', 'qw'));   // ,qw,,qw,aba
alert(nonCaptureSplit('qwqwaba', 'ba'));   // qwqwa,ba,
alert(nonCaptureSplit('baaqwqbawaba', 'ba')); // ,ba,aqwq,ba,wa,ba,

alert(nonCaptureSplit("L'architecture du système d'information devient", "ARCH"));
// L',arch,itecture du système d'information devient

alert(nonCaptureSplit("ARCHIMAG", "ARCH")); // ,ARCH,IMAG

对于具有大量匹配的大字符串来说,这可能有点低效,但仅限于不支持非捕获拆分的浏览器。测试结果在 Safari 和 IE 6 中匹配。请彻底测试,如果有问题请告诉我。

哦,这不是一个通用的解决方案,但它应该适用于类似于OP的有限情况。

关于javascript - 如何在旧版 IE 中使用 String.split 捕获组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28342156/

相关文章:

java - 异步使用 Java applet

javascript - Firefox 中 Flash 顶部的 CSS/JavaScript 导航菜单

javascript - 正则表达式从属性查找图像 src/路径

regex - 所有正则表达式实现的列表?

javascript - Angular 过滤器将所有下划线替换为空格

javascript - 使用来自前端的 Oauth 密码流程进行身份验证

javascript - 跟踪和统计 Firebase 调用

java - 如何使用struts 2标签分割字符串?

python - 我如何将字符串分成 python 部分

javascript - 在javascript中拆分字符串