【问题标题】:Javascript regex - split stringJavascript 正则表达式 - 拆分字符串
【发布时间】:2011-06-18 16:41:50
【问题描述】:

正在努力满足正则表达式的要求。我需要将一个字符串拆分成一个数组,只要它找到一个正斜杠。但如果正斜杠前面有转义符,则不会。

例如,如果我有这个字符串:

hello/world

我希望它像这样被拆分成一个数组:

arrayName[0] = hello
arrayName[1] = world

如果我有这个字符串:

hello/wo\/rld

我希望它像这样被拆分成一个数组:

arrayName[0] = hello
arrayName[1] = wo/rld

有什么想法吗?

【问题讨论】:

标签: javascript regex string split


【解决方案1】:

我不会在这份工作中使用split()。匹配路径组件本身比匹配分隔符要容易得多。例如:

var subject = 'hello/wo\\/rld';
var regex = /(?:[^\/\\]+|\\.)+/g;
var matched = null;
while (matched = regex.exec(subject)) {
  print(matched[0]);
}

输出:

hello
wo\/rld

test it at ideone.com

【讨论】:

  • 这对我来说是最好的答案。
  • 同意。绝对是最好的答案。
【解决方案2】:

以下内容有点冗长,但会起作用,并且通过不使用正则表达式来避免IE's broken split implementation 的问题。

function splitPath(str) {
    var rawParts = str.split("/"), parts = [];
    for (var i = 0, len = rawParts.length, part; i < len; ++i) {
        part = "";
        while (rawParts[i].slice(-1) == "\\") {
            part += rawParts[i++].slice(0, -1) + "/";
        }
        parts.push(part + rawParts[i]);
    }
    return parts;
}

var str = "hello/world\\/foo/bar";
alert( splitPath(str).join(",") );

【讨论】:

  • 干杯!这似乎是我一直在寻找的解决方案。
【解决方案3】:

这是一种改编自this blog post中的技术的方法:

var str = "Testing/one\\/two\\/three";
var result = str.replace(/(\\)?\//g, function($0, $1){
  return $1 ? '/' : '[****]';
}).split('[****]');

Live example

给定:

Testing/one\/two\/three

结果是:

[0]: Testing
[1]: one/two/three

首先使用简单的“假”lookbehind 将/ 替换为[****] 并将\/ 替换为/,然后拆分[****] 值。 (显然,将[****] 替换为字符串中不存在的任何内容。)

【讨论】:

  • 谢谢 :) 这种东西适合我。
【解决方案4】:

/* 如果您从 ajax 响应或数据库查询中获取字符串, 也就是说,该字符串尚未被 javascript 解释, 您可以匹配没有斜杠或已转义斜杠的字符序列。 如果您在脚本中定义字符串,请转义转义符并在匹配后删除它们。 */

var s='hello/wor\\/ld';
s=s.match(/(([^\/]*(\\\/)+)([^\/]*)+|([^\/]+))/g) || [s];
alert(s.join('\n'))
s.join('\n').replace(/\\/g,'')

/*  returned value: (String)
hello
wor/ld
*/

【讨论】:

    【解决方案5】:

    这是rubular.com的示例

    【讨论】:

    • 这对 Ruby 来说可能很棒,但看起来它不适用于 JavaScript,至少不适用于 splitjsbin.com/ipote5 如果你想以另一种方式使用它,我会建议发布。
    • 请在此处而不是在其他网站上发布解决方案。
    • 这不起作用:"hello/wor\/rld".match(/([a-z]+(\\\/)?[a-z]+)/) => ["hello", "hello", undefined]
    • @Justin:如果您使用g 标识符str.match(/[a-z]+(\\\/)?[a-z]+/g);,它确实有效,但如果有多个\/,则它会失败。 (或者小写字母旁边的任何其他字符)
    • 因此,如您所说,在此处发布解决方案非常重要。
    【解决方案6】:

    对于短代码,您可以使用反向来模拟负向后视

    function reverse(s){
      return s.split('').reverse().join('');
    }
    
    var parts = reverse(myString).split(/[/](?!\\(?:\\\\)*(?:[^\\]|$))/g).reverse();
    for (var i = parts.length; --i >= 0;) { parts[i] = reverse(parts[i]); }
    

    但为了提高效率,最好在 /[/]/ 上拆分,然后遍历数组并重新加入最后有转义的元素。

    【讨论】:

      【解决方案7】:

      这样的事情可能会为您解决问题。

      var str = "/hello/wo\\/rld/";
      var split = str.replace(/^\/|\\?\/|\/$/g, function(match) {
        if (match.indexOf('\\') == -1) {
          return '\x00';
        }
        return match;
      }).split('\x00');       
      
      alert(split);
      

      【讨论】:

        猜你喜欢
        • 2021-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多