2009-08-08 36 views
11

Có câu lệnh regex đặc biệt nào như \ w biểu thị tất cả các ký tự có thể in được không? Tôi muốn xác thực rằng một chuỗi chỉ chứa một ký tự có thể được in - tức là. không chứa các ký tự điều khiển ASCII như \ b (chuông), hoặc null, vv Mọi thứ trên bàn phím đều ổn, và cũng là ký tự UTF.Regex cho tất cả các ký tự INFINTABLE

Nếu không có tuyên bố đặc biệt, làm cách nào tôi có thể chỉ định điều này trong regex?

+3

Nếu bạn đang tìm kiếm các ký tự ASCII thuần túy, bạn có thể sử dụng Regex như '[- ~] +', phù hợp với mọi ASCII thấp từ dấu cách đến dấu ngã . – saluce

Trả lời

7

Có chỉ định loại ký tự POSIX [:print:] phải khớp với các ký tự có thể in và [:cntrl:] cho các ký tự điều khiển. Lưu ý rằng các mã đối sánh này trong toàn bộ bảng ASCII, do đó chúng có thể không phù hợp để khớp với các mã hóa khác.

Nếu không, biểu thức [\x00-\x1f] sẽ khớp với các ký tự điều khiển ASCII, mặc dù lại có thể in được bằng các mã hóa khác.

1

Nó phụ thuộc rất nhiều vào gói regex bạn đang sử dụng. Đây là một trong những tình huống mà một số người nói rằng điều tuyệt vời về tiêu chuẩn là có quá nhiều thứ để lựa chọn.

Nếu bạn tình cờ sử dụng C, chức năng/vĩ mô isprint(3) là bạn của bạn.

13

Nếu hương vị regex của bạn hỗ trợ Unicode properties, đây có lẽ là tốt nhất cách tốt nhất:

\P{Cc} 

Đó phù hợp với bất kỳ ký tự đó không phải là một nhân vật điều khiển, cho dù đó là ASCII - [\x00-\x1F\x7F] - hoặc latin1 - [\x80-\x9F] (còn được gọi là ký tự điều khiển C1).

Sự cố với các lớp POSIX như [:print:] hoặc \p{Print} là chúng có thể khớp với những thứ khác nhau tùy thuộc vào hương vị regex và có thể là cài đặt ngôn ngữ của nền tảng cơ bản. Trong Java, chúng được định hướng theo định dạng ASCII. Điều đó có nghĩa là \p{Print} chỉ khớp với các ký tự in ASCII - [\x20-\x7E] - trong khi \P{Cntrl} (lưu ý chữ 'P') khớp với mọi thứ là không phải ký tự điều khiển ASCII - [^\x00-\x1F\x7F]. Tức là, nó khớp với bất kỳ ký tự ASCII nào không phải là ký tự điều khiển, hoặc bất kỳ ký tự không phải ASCII nào - bao gồm cả ký tự điều khiển C1.

8

Rất muộn cho bữa tiệc, nhưng regexp này hoạt động: /[ -~]/.

Làm cách nào? Nó khớp với tất cả các ký tự trong phạm vi từ không gian (ASCII DEC 32) đến dấu ngã (ASCII DEC 126), là phạm vi của tất cả các ký tự có thể in.

Nếu bạn muốn dải ký tự ASCII, bạn có thể sử dụng một cái gì đó như:

$someString.replace(/[^ -~]/g, ''); 

Chú ý: đây là không hợp lệ .net mã, nhưng một ví dụ về việc sử dụng regexp cho những người vấp ngã này qua tìm kiếm động cơ sau.

0

Thêm vào @ Alan-Moore, \P{Cc} thực sự là ví dụ về Negative Unicode Category or Unicode Block (ref: Character Classes in Regular Expressions). \P{name} khớp với bất kỳ ký tự nào mà không thuộc về đối với danh mục chung Unicode hoặc khối được đặt tên. Xem liên kết được giới thiệu để biết thêm ví dụ về các khối được đặt tên được hỗ trợ trong .Net

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