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.
Nguồn
2008-10-03 18:57:27
Đ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 (\ ") –
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
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