2011-01-31 45 views
15

Đấu tranh với yêu cầu regex. Tôi cần phải chia một chuỗi thành một mảng bất cứ nơi nào nó tìm thấy một dấu gạch chéo về phía trước. Nhưng không phải nếu dấu gạch chéo chuyển tiếp trước bởi một lối thoát.Javascript regex - tách chuỗi

Ví dụ, nếu tôi có chuỗi này:

hello/world 

Tôi muốn nó được chia thành một mảng như sau:

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

Và nếu tôi có chuỗi này:

hello/wo\/rld 

Tôi muốn nó được chia thành một mảng như vậy:

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

Bất kỳ ý tưởng nào?

+0

Trang này có thể sẽ giúp: http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript Không đăng đây là một câu trả lời * * bởi vì tôi không có thời gian ngay bây giờ để đưa ra một ví dụ cụ thể cho những gì bạn cần. Nhưng tôi khá chắc chắn bạn có thể đến đó từ bài đăng đó. Chúc may mắn. –

Trả lời

3

Sau đây là một chút dài nhưng sẽ hoạt động và tránh được sự cố với IE's broken split implementation bằng cách không sử dụng cụm từ thông dụng.

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(",")); 
+0

Chúc mừng! Điều này có vẻ như giải pháp mà tôi đang tìm kiếm. – WastedSpace

0

Dưới đây là một ví dụ tại rubular.com

+1

Điều này có thể tuyệt vời với Ruby, nhưng không giống như nó hoạt động với JavaScript, ít nhất là không phải với 'split': http://jsbin.com/ipote5 Nếu bạn đang nghĩ đến việc sử dụng nó theo cách khác, tôi khuyên bạn nên đăng bài đó. –

+2

Vui lòng đăng giải pháp ở đây thay vì trên một trang web khác. – user113716

+1

Điều này không hoạt động: '" hello/wor \/rld ".match (/ ([az] + (\\\ /)? [Az] +) /)' => '[" hello "," hello ", undefined]' –

3

Đây là một cách chuyển thể từ các kỹ thuật trong this blog post:

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

Live example

Given:

Testing/one\/two\/three 

Kết quả là:

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

Đó đầu tiên sử dụng đơn giản "giả" lookbehind để thay thế / với [****] và để thay thế \/ với /, sau đó chia tách trên giá trị [****]. (Rõ ràng, thay thế [****] với bất cứ điều gì mà sẽ không có trong chuỗi.)

+0

Cảm ơn :) Đây là loại điều phù hợp với tôi. – WastedSpace

0

Đối với mã ngắn, bạn có thể sử dụng ngược lại để mô phỏng lookbehind tiêu cực

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]); } 

nhưng phải hiệu quả, nó có thể là tốt hơn để chia trên /[/]/ và sau đó đi bộ mảng và tham gia lại các yếu tố có lối thoát ở cuối.

0

Một cái gì đó như thế này có thể chăm sóc nó cho bạn.

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

alert(split); 
+0

Làm việc đầu tiên \/nhưng không hoạt động trên tất cả – ehudokai

+0

Um, chắc chắn là vậy. http://jsbin.com/uvuni4/edit – Hemlock

1

/* Nếu bạn đang nhận được chuỗi của bạn từ một phản ứng ajax hoặc một truy vấn cơ sở dữ liệu, có nghĩa là, chuỗi chưa được giải thích bằng javascript, bạn có thể phù hợp với chuỗi ký tự mà một trong hai không có dấu gạch chéo hoặc đã thoát khỏi dấu gạch chéo. Nếu bạn đang xác định chuỗi trong một tập lệnh, hãy thoát khỏi thoát và xóa chúng sau trận đấu. */

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 
*/ 
24

Tôi sẽ không sử dụng split() cho công việc này. Nó dễ dàng hơn nhiều để phù hợp với các thành phần đường dẫn, chứ không phải là các dấu phân tách. Ví dụ:

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

đầu ra:

hello 
wo\/rld 

test it at ideone.com

+2

Đây có vẻ là câu trả lời hay nhất cho tôi. –

+1

Đồng ý. Chắc chắn là câu trả lời tốt nhất. – Yobert

Các vấn đề liên quan