遇到了一个正则表达式的要求。我需要将一个字符串分割成一个数组,每当发现斜杠时就进行分割。但如果斜杠前面有转义字符,则不进行分割。
例如,如果我有这个字符串:
hello/world
我希望它被拆分为像这样的数组:
arrayName[0] = hello
arrayName[1] = world
如果我有这个字符串:
hello/wo\/rld
我希望把它分割成数组,就像这样:
arrayName[0] = hello
arrayName[1] = wo/rld
有任何想法吗?
遇到了一个正则表达式的要求。我需要将一个字符串分割成一个数组,每当发现斜杠时就进行分割。但如果斜杠前面有转义字符,则不进行分割。
例如,如果我有这个字符串:
hello/world
我希望它被拆分为像这样的数组:
arrayName[0] = hello
arrayName[1] = world
如果我有这个字符串:
hello/wo\/rld
我希望把它分割成数组,就像这样:
arrayName[0] = hello
arrayName[1] = wo/rld
有任何想法吗?
我不会使用split()
来完成这个任务。匹配路径组件本身要比匹配分隔符容易得多。例如:
var subject = 'hello/wo\\/rld';
var regex = /(?:[^\/\\]+|\\.)+/g;
var matched = null;
while (matched = regex.exec(subject)) {
print(matched[0]);
}
输出:
hello
wo\/rld
var str = "Testing/one\\/two\\/three";
var result = str.replace(/(\\)?\//g, function($0, $1){
return $1 ? '/' : '[****]';
}).split('[****]');
给定:
Testing/one\/two\/three
[0]: Testing
[1]: one/two/three
首先使用简单的“伪”后置查找将/
替换为[****]
,将\/
替换为/
,然后根据[****]
值进行拆分。(显然,用不在字符串中的任何内容替换[****]
。)
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(",") );
/* 如果您从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
*/
对于短代码,您可以使用反向引用来模拟负回顾后断言
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]); }
但为了效率,最好是在/[/]/
上进行分割,然后遍历数组并重新连接具有转义结尾的元素。
类似这样的代码可能会为您解决此问题。
var str = "/hello/wo\\/rld/";
var split = str.replace(/^\/|\\?\/|\/$/g, function(match) {
if (match.indexOf('\\') == -1) {
return '\x00';
}
return match;
}).split('\x00');
alert(split);
这里有一个例子,位于rubular.com
split
:http://jsbin.com/ipote5 如果您想以其他方式使用它,我建议您发布一下。 - T.J. Crowder"hello/wor\/rld".match(/([a-z]+(\\\/)?[a-z]+)/)
=> ["hello", "hello", undefined]
- Justin Johnsong
标识符 str.match(/[a-z]+(\\\/)?[a-z]+/g);
,它就能起作用,但是如果有多个 \/
(或者任何其他小写字母以外的字符),它就会失败。 - user113716