2012-01-05 28 views
6

cảm ơn bạn đã tìm kiếm,Regex: Yêu cầu báo giá được thoát trong một chuỗi

Tôi đã có một thời gian khủng khiếp khi cố gắng tìm đúng cụm từ tìm kiếm cho câu hỏi regex này. Tôi cần đảm bảo rằng các dấu ngoặc kép đã được thoát trong một chuỗi, nếu không thì kết quả khớp sẽ không thành công. (Hầu hết các kết quả tìm kiếm cho các loại hình câu hỏi chỉ là trang nói rằng bạn cần phải thoát khỏi dấu ngoặc kép hoặc làm thế nào để thoát khỏi dấu ngoặc kép.)

hợp lệ:

This is valid 
This \"is Valid 
This is al\"so Valid\" 

không hợp lệ:

This i"s invalid 
This i"s inv"alid 

Điều duy nhất Tôi đã quản lý để tìm thấy cho đến nay là

((?:\\"|[^"])*) 

Điều này dường như khớp với phần đầu tiên của số người theo dõi Do, nhưng không sau khi trích dẫn thoát

This is a \"test 

Một lần nữa, điều này sẽ thất bại:

This is a \"test of " the emergency broadcast system 

Nhờ sự giúp đỡ, tôi hy vọng điều này thậm chí còn có thể.

+1

Ngôn ngữ nào bạn đang sử dụng? –

+0

+1, vấn đề thú vị mà REs thực sự có vẻ là công cụ phù hợp. –

+0

@JosephSilber Tôi thực sự không sử dụng một ngôn ngữ, regex này sẽ đi vào bên trong một trường regex được sử dụng trong CMS yêu cầu người dùng nhập vào để khớp với nó :) – Bung

Trả lời

6

Trong C#, điều này dường như làm việc như bạn muốn:

string pattern = "^([^\"\\\\]*(\\\\.)?)*$"; 

Tước ra thoát lá bạn với:

^([^"\\]*(\\.)?)*$ 

mà gần như dịch thành: bắt đầu-chuỗi, (multi-chars-exclu ding-quote-hoặc-backslash, tùy chọn-backslash-anychar) -repeated, end-of-string

Đó là các điểm đánh dấu đầu chuỗi và kết thúc chuỗi bắt buộc đối sánh với văn bản hoàn chỉnh.

+0

điều này đã làm việc tốt cho tôi, ngoại trừ một trường hợp: Đây là \ "hợp lệ \ Tôi tin rằng mặc dù nó không chắc tôi ' sẽ nhận được đầu vào với dấu gạch chéo ở cuối và có thể để lỗi thất bại – Bung

+2

Có, nó được thiết kế để không thành công trong trường hợp một dấu gạch chéo ngược ở cuối. Lý do là nếu chuỗi hỗ trợ ký tự thoát bằng cách sử dụng dấu gạch chéo ngược, một dấu chéo ngược đơn không bao giờ có thể hợp lệ. – adelphus

+0

ah có ý nghĩa hoàn hảo, cảm ơn bạn – Bung

1

Bạn cần phải thực hiện mọi thứ trừ dấu gạch chéo ngược và trích dẫn, hoặc dấu gạch chéo ngược và ký tự tiếp theo.

([^\\"]|\\.)* 

Bằng cách này, đây sẽ thất bại:

ab\\"c 

này sẽ thành công:

ab\\\"c 

này sẽ thành công:

ab\"c 
2

Không biết ngôn ngữ mà bạn sử dụng, nhưng tôi đã làm theo cách này:

làm cho một regexp, phù hợp với một trích dẫn mà không có một dấu chéo ngược, mà sẽ thất bại trên

This is a \"test 

và đã thành công trên

This is a \"test of " the emergency broadcast system 

ví dụ này:

.*(?<!\\)".* 

và sau đó sẽ sử dụng biểu thức phủ định với kết quả. hy vọng điều này sẽ giúp bạn

thử nghiệm của tôi trong java trông giống như

String pat = ".*(?<!\\\\)\".*"; 
    String s = "This is a \\\"test"; 
    System.out.println(!s.matches(pat)); 
    s = "This is a \\\"test of \" the emergency broadcast system"; 
    System.out.println(!s.matches(pat)); 
2

Bạn muốn sử dụng giao diện phủ định.

(?<!\\)" 

Regex này sẽ khớp với tất cả các dấu ngoặc kép không có dấu gạch chéo.

Nếu bạn chạy regex này dựa vào chuỗi mẫu của bạn và nó tìm thấy 1 hoặc nhiều kết quả trùng khớp, thì chuỗi đó không hợp lệ.

1

RegEx bạn đang tìm kiếm là:

/^(?:[^"]*(?:(?<=\\\)"|))*$/ 

Giải thích:[^"]* sẽ phù hợp với đầu vào cho đến đầu tiên " được tìm thấy hoặc cuối của đầu vào là đạt. Nếu tìm thấy " thì hãy đảm bảo rằng trong (?<=\\\)" lookbehind là luôn là trước bởi /. Kịch bản trên là đệ quy lặp lại cho đến khi kết thúc dữ liệu đầu vào.

KIỂM TRA: Hãy xem xét sau mã PHP để kiểm tra:

$arr=array('This is valid', 
'This \"is Valid', 
'This is al\"so Valid\"', 
'This i"s invalid', 
'This i"s inv"alid', 
'This is a \"test', 
'This is a \"test of " the emergency broadcast system - invalid'); 
foreach ($arr as $a) { 
    echo "$a => "; 
    if (preg_match('/^(?:[^"]*(?:(?<=\\\)"|))*$/', $a, $m)) 
     echo "matched [$m[0]]\n"; 
    else 
     echo "didn't match\n"; 
} 

OUTPUT:

This is valid => matched [This is valid] 
This \"is Valid => matched [This \"is Valid] 
This is al\"so Valid\" => matched [This is al\"so Valid\"] 
This i"s invalid => didn't match 
This i"s inv"alid => didn't match 
This is a \"test => matched [This is a \"test] 
This is a \"test of " the emergency broadcast system - invalid => didn't match 
+0

Xem mã này chạy tại: http://ideone.com/gUyPe – anubhava

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