[英]Javascript regex - split string
苦苦掙扎的正則表達式要求。 我需要將字符串拆分成數組,無論它在哪里找到正斜杠。 但是如果正斜杠之前是逃避的話。
例如,如果我有這個字符串:
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
首先使用簡單的“假”lookbehind替換/
[****]
並替換\\/
with /
,然后拆分[****]
值。 (顯然,將[****]
替換為不在字符串中的任何內容。)
以下是一個有點啰嗦,但會工作,並通過不使用正則表達式避免IE的分裂實現的問題。
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
*/
這是rubular.com的一個例子
對於短代碼,您可以使用反向來模擬負向后視
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.