2013-02-26 41 views
7

Tôi cần tìm văn bản của tất cả số có một chữ số.regex: tìm số có một chữ số

Mã của tôi:

$string = 'text 4 78 text 558 [email protected] 5 text 78998 text'; 
$pattern = '/ [\d]{1} /'; 

(kết quả: 4 và 5)

Tất cả mọi thứ hoạt động hoàn hảo, chỉ muốn hỏi nó là đúng để sử dụng không gian? Có thể có một số cách khác để phân biệt một chữ số.

Cảm ơn

+0

Bạn đang thiếu một số trường hợp đặc biệt ở đây. Khi số ở đầu, ở cuối và khi nó chỉ là một chữ số trong một chuỗi. – abc667

Trả lời

12

Trước hết, [\d]{1} tương đương với \d.

Đối với câu hỏi của bạn, sẽ tốt hơn nếu bạn sử dụng xác nhận chiều rộng bằng không như đường biên lookbehind/lookahead hoặc từ (\b). Nếu không, bạn sẽ không khớp các chữ số đơn liên tiếp vì không gian hàng đầu của chữ số thứ hai sẽ được so khớp với khoảng trắng cuối của chữ số đầu tiên (và các kết quả trùng lặp sẽ không được tìm thấy).

Dưới đây là làm thế nào tôi sẽ viết này:

(?<!\S)\d(?!\S) 

này có nghĩa là "phù hợp với một chữ số duy nhất nếu có không phải là một nhân vật phi khoảng trắng trước đó, và không có một nhân vật phi khoảng trắng sau khi nó" .

Tôi đã sử dụng âm kép như (?!\S) thay vì (?=\s) để bạn cũng sẽ khớp các chữ số đơn ở đầu hoặc cuối chuỗi.

Tôi thích này trên \b\d\b ví dụ của bạn bởi vì nó trông giống như bạn thực sự chỉ muốn để phù hợp khi chữ số được bao quanh bởi không gian, và \b\d\b sẽ phù hợp với 45 trong một chuỗi như 192.168.4.5

Để cho phép chấm câu ở cuối, bạn có thể sử dụng như sau:

(?<!\S)\d(?![^\s.,?!]) 

Thêm bất kỳ ký tự dấu bổ sung mà bạn muốn cho phép sau khi chữ số đến lớp nhân vật (bên trong dấu ngoặc vuông, nhưng chắc chắn rằng nó là sau khi lần thứ e ^).

+0

Thật không may RegEx cuối cùng không hoạt động trong Edge hoặc Firefox, chỉ Chrome – Dan

3

Tìm kiếm xung quanh ranh giới từ:

\b\d\b 

Theo giải thích của những người khác, điều này sẽ trích xuất một con số có nghĩa là một số ký tự đặc biệt có thể không được tôn trọng như "" trong một địa chỉ ip. Để giải quyết vấn đề đó, hãy xem câu trả lời của F.J và Mike Brant.

10

Sử dụng word boundaries. Lưu ý rằng định lượng phạm vi {1} (một đơn \d sẽ chỉ khớp với một chữ số) và lớp ký tự [] là thừa vì nó chỉ bao gồm một ký tự.

\b\d\b 
0

Nó thực sự phụ thuộc vào nơi các con số có thể xuất hiện và liệu bạn có quan tâm nếu chúng liền kề với các ký tự khác (như . ở cuối câu).Ít nhất, tôi sẽ sử dụng ranh giới từ để bạn có thể có được con số ở đầu và cuối của chuỗi đầu vào:

$pattern = '/\b\d\b/'; 

Nhưng bạn có thể xem xét chấm câu ở cuối như:

$pattern = '/\b\d(\b|\.|\?|\!)/'; 
Các vấn đề liên quan