2008-10-03 25 views

Trả lời

35
  • Không thoát:

    /([^=,]*)=("[^"]*"|[^,"]*)/ 
    
  • đúp quote thoát cho cả khoá và giá trị:

    /((?:"[^"]*"|[^=,])*)=((?:"[^"]*"|[^=,])*)/ 
    
    key=value,"key with "" in it"="value with "" in it",key=value" "with" "spaces 
    
  • Backs đòn chuỗi thoát:

    /([^=,]*)=("(?:\\.|[^"\\]+)*"|[^,"]*)/ 
    
    key=value,key="value",key="val\"ue" 
    
  • Full xuyệc ngược thoát:

    /((?:\\.|[^=,]+)*)=("(?:\\.|[^"\\]+)*"|(?:\\.|[^,"\\]+)*)/ 
    
    key=value,key="value",key="val\"ue",ke\,y=val\,ue 
    

Edit: Added thoát lựa chọn thay thế.

Chỉnh sửa2: Đã thêm phương án thoát khác.

Bạn sẽ phải xóa các khóa/giá trị bằng cách xóa mọi ký tự thoát và dấu ngoặc kép xung quanh.

+0

Điều này phù hợp với kịch bản đơn giản của tôi! Mặc dù, nó có thể là tốt đẹp cho nó để hỗ trợ bao gồm cả một báo giá trong giá trị bằng cách thoát nó, hoặc đôi ("") hoặc với một dấu gạch chéo ngược (\ ") –

+0

bạn có thể vui lòng giúp tôi? Tôi cần một cái gì đó tương tự nhưng giống như json http : //stackoverflow.com/questions/6099891/json-text-split-reg-expression-or-parser – Val

+0

regex cho khóa = giá trị & khóa = giá trị trong đó khóa hoặc giá trị có thể là null, khóa và giá trị có thể là bất kỳ thứ gì – virsha

2

Câu trả lời hay từ MizardX. Niggles nhỏ - nó không cho phép các khoảng trống xung quanh tên vv (có thể không quan trọng), và nó thu thập các dấu ngoặc kép cũng như giá trị được trích dẫn (cũng có thể không quan trọng), và nó không có cơ chế thoát để nhúng nhân vật báo giá kép trong giá trị được trích dẫn (trong đó, một lần nữa, có thể không quan trọng).

Khi được viết, mẫu hoạt động với hầu hết các hệ thống biểu thức chính quy mở rộng. Việc sửa chữa những tiếng cười khúc khích có lẽ sẽ đòi hỏi phải đi sâu vào, Perl nói. Phiên bản này sử dụng dấu ngoặc kép để thoát - do đó a = "a" "b" tạo giá trị trường 'a' "b '(không hoàn hảo, nhưng có thể sửa sau đó dễ dàng):

/\s*([^=,\s]+)\s*=\s*(?:"((?:[^"]|"")*)"|([^,"]*))\s*,?/ 

Hơn nữa, bạn phải sử dụng $ 2 hoặc $ 3 để thu thập giá trị, trong khi với câu trả lời của MizardX, bạn chỉ cần sử dụng $ 2. Vì vậy, nó không phải là dễ dàng hay tốt đẹp, nhưng nó bao gồm một vài trường hợp cạnh. Nếu câu trả lời đơn giản là thích hợp, hãy sử dụng nó.

thử nghiệm kịch bản:

#!/bin/perl -w 

use strict; 
my $qr = qr/\s*([^=,\s]+)\s*=\s*(?:"((?:[^"]|"")*)"|([^,"]*))\s*,?/; 

while (<>) 
{ 
    while (m/$qr/) 
    { 
     print "1= $1, 2 = $2, 3 = $3\n"; 
     $_ =~ s/$qr//; 
    } 
} 

này witters về hoặc $ 2 hoặc $ 3 được undefined - một cách chính xác.

0

Đây là cách tôi sẽ làm điều đó nếu bạn có thể sử dụng Perl 5.10.

 
qr/ 
    (?<key> 
    (?: 
     [^=,\\] 
    | 
     (?&escape) 
    )++ # Prevent null keys 
) 

    \s*+ 
    = 
    \s*+ 

    (?<value> 
    (?&quoted) 
    | 
    (?: 
     [^=,\s\\] 
    | 
     (?&escape) 
    )++ # Prevent null value (use quotes for that) 
) 

    (?(DEFINE) 
    (?<escape>\\.) 
    (?<quoted> 
     " 
     (?: 
      (?&escaped) 
     | 
      [^"\\] 
     )*+ 
     " 
    ) 
) 
/x 

Các yếu tố sẽ được truy cập thông qua %+.

perlretut rất hữu ích khi tạo câu trả lời này.

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