2010-09-20 25 views
12

Tôi thực sự muốn sử dụng \ w nhưng nó cũng phù hợp với gạch dưới vì vậy tôi sẽ với [A-Za-z] mà cảm thấy không cần thiết tiết và trung tâm Mỹ. Có cách nào tốt hơn để làm điều này? Một cái gì đó như [\ w^_] (Tôi nghi ngờ tôi đã có cú pháp đúng)?Cách tốt nhất để chỉ khớp các chữ cái trong một regex là gì?

+4

'[A-Za-z]' không phải là Mỹ làm trung tâm, đó là trung tâm ASCII. – CanSpice

+0

@CanSpice, tôi muốn nói đó là trung tâm Latin, vì ASCII chỉ sử dụng bảng chữ cái latin. – Axeman

+1

@Axeman, Nguồn? AFAIK nhiều ngôn ngữ có nguồn gốc từ tiếng Latin đã nhấn mạnh các nguyên âm và chữ cái. [A-Za-z] sẽ không khớp với Español lẫn Française. Ngay cả Latin tinh khiết cũng có Æ glyph không nằm trong ASCII. Bạn đang nói về tiếng Latin nào? – Kyordhel

Trả lời

7

Bạn có thể sử dụng /[a-z]/i hoặc /[[:alpha:]]/ chỉ là tốt. Trên thực tế, \w bao gồm các số để thậm chí không hoạt động.

+1

Tôi lấy nó là 'i' làm cho nó không phân biệt chữ hoa chữ thường ? – keithjgrant

+0

Đúng vậy. – mkb

+1

Đây chỉ là câu trả lời không chính xác. Đọc dưới đây. –

15

Có lẽ bạn muốn nói là /[[:alpha:]]/? Xem perlre để thảo luận về các lớp nhân vật POSIX.

+1

Tôi vẫn không nghĩ rằng điều này có tính đến các ký tự quốc tế, vì ': alpha:' vẫn là 'a-zA-Z' – vol7ron

+0

Tôi đã sai; các perldocs nên được cập nhật. Tuy nhiên nó bao gồm các dấu câu phụ: 'ʹʺʻˍˎˏːˑˬˮ̀́' – vol7ron

+0

@ vol7tron: Nhận xét của bạn bị rò rỉ ... –

1

bạn đang tìm kiếm quốc tế hóa trong regex của mình? sau đó bạn sẽ cần phải làm một cái gì đó giống như anh chàng này đã làm: JavaScript validation issue with international characters

rõ ràng phù hợp trên tất cả các chữ tiếng trăng :)

+0

Tôi không thấy bất kỳ chữ cái mặt trăng nào trong regex đó, nhưng nó có thể chỉ vì tôi đang đọc nó vào ban ngày. – mkb

+0

Khi bạn nhìn thấy chúng, bạn được cho là howl – vol7ron

4

Một vài lựa chọn:

1. /[a-z]/i    # case insensitive 
2. /[A-Z]/i    # case insensitive 
3. /[A-z]/    # explicit range listing (capital 'A' to lowercase 'z') 
4. /[[:alpha:]]/   # POSIX alpha character class 

tôi khuyên bạn nên sử dụng một trong hai trường hợp không nhạy cảm, hoặc theo cách thực sự /[a-zA-z]/, trừ khi bạn có một sở thích ngôn ngữ nhất định trong tâm trí.

Lưu ý:

  • Số 3 đòi hỏi vốn 'A' đầu tiên và sau đó thường 'z' vì thứ tự của các giá trị ASCII; nó không hoạt động nếu bạn làm ngược lại: a-Z. Ngoài ra: phương pháp này sẽ không đạt tiêu chí không có gạch dưới vì nó bao gồm[\]^_ `.
  • Số 4 sẽ phù hợp trên những ký tự ngôn ngữ bổ sung, nhưng nó cũng phù hợp trên:
    ʹʺʻˍˎˏːˑˬˮ̀́   (cộng với nhiều người khác)
+0

Phạm vi '[A-z]' bao gồm một loạt các ký tự khác. – NullUserException

+0

Bạn chính xác có một vài dấu ngoặc và các ký tự thừa, điều này sẽ phá vỡ các tiêu chí không có gạch dưới. Tôi đã sửa đổi câu trả lời. @ bướm, vâng nhưng tôi đã sai. Thực sự là hai đầu tiên là cùng một phương pháp, chỉ hiển thị bạn có thể sử dụng đầu vào khác nhau. – vol7ron

8

Matching nhân vật quốc tế (tức là phi ASCII) là loại khó khăn, và có thể phụ thuộc vào rất nhiều thứ. Kiểm tra ví dụ này:

#!perl -w 

use strict; 
use utf8; 

my $string = "ä"; 

print "matched :alpha:\n" if $string =~ /[[:alpha:]]/; 
print "matched ^\\W0-9_\n" if $string =~ /[^\W0-9_]/; 
print "matched [a-zA-Z]\n" if $string =~ /[a-zA-Z]/; 
print "matched [a-z]i\n" if $string =~ /[a-z]/i; 
print "matched [A-z]\n" if $string =~ /[A-z]/; 

Đối với tôi điều này dẫn đến

matched :alpha: 

Nếu bạn loại bỏ các use utf8 sau đó không ai trong số các trận đấu biểu thức thông thường.

Nhìn vào this very relevant question, có vẻ như bạn có thể muốn use utf8 và kiểm tra Unicode::Semantics.

Tất nhiên, nếu bạn đang sử dụng các ký tự ASCII thẳng hơn bất kỳ biểu thức chính quy nào nói trên sẽ hoạt động.

+0

Bạn phải cẩn thận với \ w và \ W trong Perl. Đó là một chút của một mục tiêu di chuyển gần đây, vì vậy tôi sẽ không phụ thuộc vào định nghĩa của nó. –

+0

Trình chỉnh sửa của bạn hiển thị là 'ä' có thể không phải là một chữ cái trong Perl. 'ä' = "\ xE4" không được định nghĩa trong bộ ký tự ASCII, theo mặc định, Perl sẽ sử dụng các lớp ký tự ASCII cho chuỗi không được mã hóa dưới dạng UTF8. Việc thêm 'use utf8;' sẽ xử lý mã nguồn của bạn là UTF8 và tạo chuỗi "ä" Unicode. Trong bộ ký tự Unicode 'ä' là ký tự alpha. So sánh '$ string =" ä ";' vs '$ string = decode (" iso-8859-1 "," ä ");' không 'dùng utf8;'. Trong trường hợp đầu tiên, Perl sẽ thấy dữ liệu nhị phân, trong dữ liệu nhị phân thứ hai được hiểu là Latin-1 và được chuyển thành UTF-8. –

11

Chỉ cần sử dụng \p{L} có nghĩa là "bất kỳ chữ cái Unicode nào" và hoạt động trong Perl (/\p{L}/). Bạn có thể cần phải use utf8;.

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