2015-08-22 20 views
6

Tôi đang xây dựng trình xác thực JSON từ đầu, nhưng tôi khá mắc kẹt với phần chuỗi. Hy vọng của tôi đang xây dựng một regex mà sẽ phù hợp với trình tự sau đây được tìm thấy trên JSON.org:Regex để đối sánh một chuỗi JSON

JSON.org String Sequence

regex của tôi cho đến nay là:

/^\"((?=\\)\\(\"|\/|\\|b|f|n|r|t|u[0-9a-f]{4}))*\"$/ 

Nó phù hợp với tiêu chí với một dấu chéo ngược sau bởi một ký tự và một chuỗi rỗng. Nhưng tôi không chắc cách sử dụng phần UNICODE.

Có một regex để phù hợp với bất kỳ chuyên gia UNICODE nhân vật "hoặc \ hoặc ký tự kiểm soát? Và nó sẽ phù hợp với một dòng mới hoặc tab ngang?

Câu hỏi cuối cùng là vì regex phù hợp với chuỗi '\ t', nhưng không phải là "" (bốn không gian, nhưng ý tưởng là một tab). Nếu không, tôi sẽ cần phải mở rộng regex với nó, đó không phải là vấn đề, nhưng tôi đoán là tab ngang là một ký tự UNICODE.

Nhờ Jaeger Kor, tôi hiện có regex sau:

/^\"((?=\\)\\(\"|\/|\\|b|f|n|r|t|u[0-9a-f]{4})|[^\\"]*)*\"$/ 

Có vẻ như chính xác, nhưng có cách nào để kiểm tra các ký tự điều khiển hay không cần thiết khi chúng xuất hiện trên các ký tự không in được trên regular-expressions.info? Dữ liệu nhập để xác thực luôn là văn bản từ vùng văn bản.

Cập nhật: regex là như sau trong trường hợp bất cứ ai cần nó:

/^("(((?=\\)\\(["\\\/bfnrt]|u[0-9a-fA-F]{4}))|[^"\\\0-\x1F\x7F]+)*")$/ 

Trả lời

7

Đối với câu hỏi chính xác của bạn tạo ra một lớp nhân vật

# Matches any character that isn't a \ or " 
/[^\\"]/ 

Và sau đó bạn chỉ có thể thêm * vào dấu chấm hết cho nhận được 0 hoặc số lượng không giới hạn hoặc cách khác 1 hoặc số không giới hạn với +

/[^\\"]*/ 

hoặc

/[^\\"]+/ 

Cũng có này là dưới đây, tìm thấy tại https://regex101.com/ dưới tab thư viện khi tìm kiếm json

/(?(DEFINE) 
# Note that everything is atomic, JSON does not need backtracking if it's valid 
# and this prevents catastrophic backtracking 
(?<json>(?>\s*(?&object)\s*|\s*(?&array)\s*)) 
(?<object>(?>\{\s*(?>(?&pair)(?>\s*,\s*(?&pair))*)?\s*\})) 
(?<pair>(?>(?&STRING)\s*:\s*(?&value))) 
(?<array>(?>\[\s*(?>(?&value)(?>\s*,\s*(?&value))*)?\s*\])) 
(?<value>(?>true|false|null|(?&STRING)|(?&NUMBER)|(?&object)|(?&array))) 
(?<STRING>(?>"(?>\\(?>["\\\/bfnrt]|u[a-fA-F0-9]{4})|[^"\\\0-\x1F\x7F]+)*")) 
(?<NUMBER>(?>-?(?>0|[1-9][0-9]*)(?>\.[0-9]+)?(?>[eE][+-]?[0-9]+)?)) 
) 
\A(?&json)\z/x 

này phải phù hợp với bất kỳ json hợp lệ, bạn cũng có thể kiểm tra nó tại trang web trên

EDIT:

Link to the regex

+0

Cảm ơn q của bạn phản ứng uick. Tôi thêm nó vào biểu thức chính quy đầu tiên của tôi và nó có vẻ hoạt động tốt. Tôi không biết gì về các nhân vật điều khiển, nhưng có lẽ tôi không cần phải lo lắng về nó vì đầu vào là từ một vùng văn bản nơi họ có thể không được chấp nhận. Regex cuối cùng bạn cung cấp là một regex hoàn chỉnh, nhưng Tôi muốn biết lỗi ở đâu. Nhưng hơn nữa, tôi sẽ kiểm tra xem nó có hữu ích hơn không! – Sietse

+0

Tôi đã chơi với regex mới nhất của bạn và khi tách chúng, chúng hoạt động rất tốt! Cảm ơn! – Sietse

+1

Thx! Url tìm kiếm là: https://regex101.com/library?orderBy=MOST_POINTS&search=json – vbrajon

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