2012-06-27 39 views
5

Câu hỏi rất đơn giản. Tôi có một chuỗi chứa nhiều yếu tố được nhúng trong dấu ngoặc đơn ngoặc kép:Một biểu thức chính quy đơn giản hơn để phân tích các chuỗi được trích dẫn

var str = "'alice' 'anna marie' 'benjamin' 'christin'  'david' 'muhammad ali'" 

Và tôi muốn phân tích nó để tôi có tất cả những cái tên đó trong một mảng:

result = [ 
'alice', 
'anna marie', 
'benjamin', 
'christin', 
'david', 
'muhammad ali' 
] 

Hiện nay tôi đang sử dụng mã này để thực hiện công việc:

var result = str.match(/\s*'(.*?)'\s*'(.*?)'\s*'(.*?)'\s*'(.*?)'/); 

Nhưng biểu thức chính quy này quá dài và nó không linh hoạt, vì vậy nếu tôi có nhiều yếu tố trong str chuỗi, tôi phải chỉnh sửa cụm từ thông dụng.

Cách nhanh nhất và hiệu quả nhất để thực hiện phân tích cú pháp này là gì? Hiệu suất và khả năng phát triển rất quan trọng trong ứng dụng web của chúng tôi.

tôi đã xem xét những câu dưới đây nhưng họ không phải là câu trả lời của tôi:

Trả lời

8

Xác định mô hình một lần và sử dụng g cờ toàn cầu.

var matches = str.match(/'[^']*'/g); 

Nếu bạn muốn các thẻ mà không có dấu nháy đơn xung quanh họ, cách tiếp cận thông thường sẽ được sử dụng tiểu trận trong REGEX - tuy nhiên JavaScript không hỗ trợ chụp các tiểu nhóm khi cờ g được sử dụng . Cách đơn giản nhất (mặc dù không nhất thiết phải hiệu quả nhất) xung quanh đây sẽ là để loại bỏ chúng sau đó, lặp đi lặp lại:

if (matches) 
    for (var i=0, len=matches.length; i<len; i++) 
     matches[i] = matches[i].replace(/'/g, ''); 

[EDIT] - như câu trả lời khác nói, bạn có thể sử dụng split() thay vào đó, nhưng chỉ khi bạn có thể dựa trên đó luôn luôn là một không gian (hoặc một số dấu phân cách chung) giữa mỗi mã thông báo trong chuỗi của bạn.

0

Một chiều;

var str = "'alice' 'benjamin' 'christin' 'david'"; 
var result = {}; 

str.replace(/'([^']*)'/g, function(m, p1) { 
    result[p1] = ""; 
}); 

for (var k in result) { 
    alert(k); 
} 
1

Khi đối tượng regex có đặt cờ global, bạn có thể thực hiện nhiều lần so với chuỗi để tìm tất cả các kết quả phù hợp. Công cụ này hoạt động bằng cách bắt đầu tìm kiếm tiếp theo sau ký tự cuối cùng được khớp trong lần chạy trước:

var buf = "'abc' 'def' 'ghi'"; 
var exp = /'(.*?)'/g; 
for(var match=exp.exec(buf); match!=null; match=exp.exec(buf)) { 
    alert(match[0]); 
} 

Cá nhân, tôi thấy đây là cách tốt để phân tích chuỗi.

EDIT: biểu thức /'(.*?)'/g trận đấu bất kỳ nội dung giữa các đơn quote ('), các modifier *? là không tham lam và nó rất đơn giản hoá mô hình.

1

Một cách tiếp cận khác nhau

Tôi đến đây cần một cách tiếp cận có thể phân tích một chuỗi cho dấu ngoặc kép và dấu ngoặc kép thuốc, giữ gìn trật tự của dấu ngoặc kép và dấu ngoặc kép thuốc, sau đó đầu ra nó với các thẻ cụ thể quấn quanh họ cho Phản ứng hay phản ứng Bản địa vì vậy tôi đã kết thúc không sử dụng câu trả lời ở đây bởi vì tôi không chắc chắn làm thế nào để có được chúng để phù hợp với nhu cầu của tôi sau đó đã làm điều này để thay thế.

function parseQuotes(str) { 
    var openQuote = false; 
    var parsed = []; 
    var quote = ''; 
    var text = ''; 
    var openQuote = false; 

    for (var i = 0; i < str.length; i++) { 
    var item = str[i]; 
    if (item === '"' && !openQuote) { 
     openQuote = true; 
     parsed.push({ type: 'text', value: text }); 
     text = ''; 
    } 
    else if (item === '"' && openQuote) { 
     openQuote = false; 
     parsed.push({ type: 'quote', value: quote }); 
     quote = ''; 
    } 
    else if (openQuote) quote += item; 
    else text += item; 
    } 

    if (openQuote) parsed.push({ type: 'text', value: '"' + quote }); 
    else parsed.push({ type: 'text', value: text }); 

    return parsed; 
} 

đó khi đưa ra này:

'Testing this "shhhh" if it "works!" " hahahah!' 

sản xuất rằng:

[ 
    { 
    "type": "text", 
    "value": "Testing this " 
    }, 
    { 
    "type": "quote", 
    "value": "shhhh" 
    }, 
    { 
    "type": "text", 
    "value": " if it " 
    }, 
    { 
    "type": "quote", 
    "value": "works!" 
    }, 
    { 
    "type": "text", 
    "value": " " 
    }, 
    { 
    "type": "text", 
    "value": "\" hahahah!" 
    } 
] 

cho phép bạn dễ dàng quấn thẻ xung quanh nó tùy thuộc vào những gì nó được.

https://jsfiddle.net/o6seau4e/4/

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