Regex chỉ khớp với các chữ cái


374

Làm thế nào tôi có thể viết một regex chỉ khớp với các chữ cái?


58
Định nghĩa của bạn là charactersgì? ASCII? Kanji? Iso-XXXX-X? UTF8?
Ivo Wetzel

45
Định nghĩa của bạn là regexgì? Perl? Emacs? Grep?
Pascal Cuoq

4
Cho rằng câu hỏi bằng tiếng Anh, trên một trang web tiếng Anh, thật công bằng khi cho rằng câu hỏi liên quan đến các ký tự bằng tiếng Anh.
vaer-k

1
Tôi đã nhận thấy rằng \ p {L} cho một chữ cái và / u cờ cho Unicode khớp với bất kỳ chữ cái nào trong regex của tôi, tức là/\p{L}+/u
MaxZoom

4
Given that the question is in English, on an English site, it's fair to assume the question regards characters in English. Đây là sự thật. Như chúng ta đã biết, người nói tiếng Anh KHÔNG BAO GIỜ địa phương hóa các ứng dụng của họ!
Alex

Câu trả lời:


392

Sử dụng bộ ký tự: [a-zA-Z]khớp với một chữ cái từ A Z Z bằng chữ thường và chữ hoa. [a-zA-Z]+khớp với một hoặc nhiều chữ cái và ^[a-zA-Z]+$chỉ khớp với các chuỗi chỉ bao gồm một hoặc nhiều chữ cái ( ^$đánh dấu điểm bắt đầu và kết thúc của chuỗi tương ứng).

Nếu bạn muốn khớp các chữ cái khác ngoài A Z, bạn có thể thêm chúng vào bộ ký tự : [a-zA-ZäöüßÄÖÜ]. Hoặc bạn sử dụng các lớp nhân vật được xác định trước như các nhân vật sở hữu Unicode lớp \p{L}mô tả các ký tự Unicode có chữ cái.


119
Đó là một giải pháp rất trung tâm ASCII. Điều này sẽ phá vỡ khá nhiều bất kỳ văn bản không phải tiếng Anh.
Joachim Sauer

7
@Joachim Sauer: Nó sẽ thay thế các ngôn ngữ sử dụng các ký tự không phải là tiếng Latin.
Gumbo

15
Đã phá vỡ 90% văn bản tiếng Đức, thậm chí không đề cập đến tiếng Pháp hoặc tiếng Tây Ban Nha. Ý vẫn có thể làm khá tốt mặc dù.
Ivo Wetzel

9
điều đó phụ thuộc vào định nghĩa của "nhân vật Latin" mà bạn chọn. J, U,, all đều có thể được lập luận là các ký tự Latin hay không, dựa trên định nghĩa của bạn. Nhưng tất cả chúng đều được sử dụng trong các ngôn ngữ sử dụng "bảng chữ cái Latin" để viết.
Joachim Sauer

9
\ p {L} phù hợp với tất cả các dấu trầm quyến rũ, v.v., vì vậy bạn nên đi với điều đó.
Radu Simionescu

198

\p{L} khớp với bất cứ thứ gì là một chữ cái Unicode nếu bạn quan tâm đến bảng chữ cái ngoài chữ cái Latinh


2
không phải trong tất cả các hương vị regex. Ví dụ, vex regexes coi \plà "Nhân vật có thể in".
Philip Potter

3
trang này chỉ đề xuất các biểu thức java, .net, perl, jgsoft, XML và XPath hỗ trợ \ p {L}. Nhưng thiếu sót lớn: python và ruby ​​(mặc dù python có mô-đun regex).
Philip Potter

6
@Philip Potter: Ruby hỗ trợ các thuộc tính ký tự Unicode bằng cách sử dụng cú pháp chính xác đó.
Jörg W Mittag

6
Tôi nghĩ rằng điều này nên được \p{L}\p{M}*+bao gồm các chữ cái được tạo thành từ nhiều điểm mã, ví dụ như một chữ cái theo dấu trọng âm. Theo regular-expressions.info/unicode.html
ZoFreX

với python 3, điều này dẫn đến một lỗibad escape \p at position 0
matanster

46

Tùy thuộc vào ý nghĩa của bạn về "nhân vật":

[A-Za-z]- tất cả các chữ cái (chữ hoa và chữ thường)

[^0-9] - tất cả các ký tự không có chữ số


Tôi có nghĩa là rau diếp. Nó dường như không hoạt động mặc dù. preg_match ('/ [a-zA-Z] + /', $ name);
Nike

[A-Za-z] chỉ là khai báo các ký tự bạn có thể sử dụng. Bạn vẫn cần phải khai báo bao nhiêu lần khai báo này phải được sử dụng: [A-Za-z] {1,2} (để khớp 1 hoặc 2 chữ cái) hoặc [A-Za-z] {1, *} (để khớp 1 hoặc nhiều chữ cái)
KristofMols

17
à à, á, ã, Ö, ... cũng là những chữ cái,,,, ঈ,,, З,, ﺥ, ﺩ א, ב, ג,, ת, ... vi.wikipedia.org/wiki/Letter_%28alph.us%29
phuclv

@phuclv: Thật vậy, nhưng điều đó phụ thuộc vào mã hóa và mã hóa là một phần của cài đặt của chương trình (cấu hình mặc định hoặc cấu hình được khai báo trong tệp cấu hình của chương trình). Khi tôi làm việc trên các ngôn ngữ khác nhau, tôi thường lưu trữ nó trong một hằng số, trong một tệp cấu hình.
Catalina Chircu

1
Mã hóa @CirthinaChircu hoàn toàn không liên quan ở đây. Mã hóa là một cách để mã hóa điểm mã trong bộ ký tự ở dạng nhị phân, ví dụ UTF-8 là mã hóa cho Unicode. Chữ OTOH phụ thuộc vào ngôn ngữ và nếu người ta nói [A-Za-z]là chữ cái thì ngôn ngữ đang được sử dụng phải được chỉ định
phuclv

32

Tùy chọn gần nhất có sẵn là

[\u\l]+

phù hợp với một chuỗi các chữ cái viết hoa và chữ thường. Tuy nhiên, nó không được hỗ trợ bởi tất cả các biên tập viên / ngôn ngữ, vì vậy có thể an toàn hơn khi sử dụng

[a-zA-Z]+

như những người dùng khác đề xuất


1
Không phù hợp với bất kỳ nhân vật đặc biệt mặc dù.
Nyerguds

20

Bạn sẽ sử dụng

/[a-z]/gi

[] - kiểm tra bất kỳ ký tự nào giữa các đầu vào đã cho

az --- bao gồm toàn bộ bảng chữ cái

g ----- trên toàn cầu trong toàn bộ chuỗi

tôi ----- viết hoa và viết thường


14

Biểu thức chính quy mà ít người đã viết là "/ ^ [a-zA-Z] $ / i" là không chính xác bởi vì cuối cùng họ đã đề cập / i là trường hợp không nhạy cảm và sau khi khớp lần đầu tiên, nó sẽ quay trở lại. Thay vì / tôi chỉ sử dụng / g dành cho toàn cầu và bạn cũng không có nhu cầu đặt ^ $ để bắt đầu và kết thúc.

/[a-zA-Z]+/g
  1. [a-z _] + khớp với một ký tự đơn có trong danh sách bên dưới
  2. Bộ định lượng: + Từ một đến không giới hạn, càng nhiều lần càng tốt, trả lại khi cần
  3. az một ký tự đơn trong phạm vi giữa a và z (phân biệt chữ hoa chữ thường)
  4. AZ một ký tự đơn trong phạm vi giữa A và Z (phân biệt chữ hoa chữ thường)
  5. sửa đổi g : toàn cầu. Tất cả các trận đấu (không trở lại vào trận đấu đầu tiên)

13

Java:

String s= "abcdef";

if(s.matches("[a-zA-Z]+")){
     System.out.println("string only contains letters");
}

4
nó không bao gồm các dấu hiệu dấu phụ nhưŹŻŚĄ
karoluS



7

Sử dụng các nhóm nhân vật

\D

Khớp với bất kỳ ký tự nào ngoại trừ chữ số 0-9

^\D+$

Xem ví dụ ở đây


8
Điều này cũng sẽ phù hợp với khoảng trắng, biểu tượng, vv mà dường như không phải là những gì câu hỏi đang yêu cầu.
DaveMongoose

Kỳ dị. Chỉ cần có một downvote về điều này, và đó không phải là tôi!
Dave Everitt

6

Chỉ cần sử dụng \whoặc [:alpha:]. Đó là một chuỗi thoát chỉ khớp với các biểu tượng có thể xuất hiện trong các từ.


9
\wcó thể không phải là một giải pháp tốt trong mọi trường hợp. Ít nhất là trong PCRE, \wcũng có thể phù hợp với các nhân vật khác. Trích dẫn sổ tay PHP : Ký tự "từ" là bất kỳ chữ cái hoặc chữ số hoặc ký tự gạch dưới, nghĩa là, bất kỳ ký tự nào có thể là một phần của "từ" Perl. Định nghĩa của các chữ cái và chữ số được điều khiển bởi các bảng ký tự của PCRE, và có thể thay đổi nếu diễn ra kết hợp cụ thể theo địa phương. Ví dụ: trong ngôn ngữ "fr" (tiếng Pháp), một số mã ký tự lớn hơn 128 được sử dụng cho các chữ cái có dấu và chúng được khớp với \ w. ".
Amal Murali

từ bao gồm các ký tự khác từ các chữ cái
V-SHY

2
\wcó nghĩa là các chữ cái và số
trùng

4

Nếu bạn có nghĩa là bất kỳ chữ cái nào trong bất kỳ mã hóa ký tự nào, thì một cách tiếp cận tốt có thể là xóa các chữ cái không phải là khoảng trắng \s, chữ số \dvà các ký tự đặc biệt khác như:

[!@#\$%\^&\*\(\)\[\]:;'",\. ...more special chars... ]

Hoặc sử dụng phủ định của phủ định trên để mô tả trực tiếp bất kỳ chữ cái nào:

\S \D and [^  ..special chars..]

Ưu điểm:

  • Hoạt động với tất cả các hương vị regex.
  • Dễ viết, đôi khi tiết kiệm rất nhiều thời gian.

Nhược điểm:

  • Dài, đôi khi không hoàn hảo, nhưng mã hóa ký tự cũng có thể bị phá vỡ.

4

Bạn có thể thử biểu thức chính quy này: [^\W\d_]hoặc [a-zA-Z].


Đó không phải [^\W|\d]là ý nghĩa
OGHaza

1
[^\W|\d]có nghĩa là không \Wvà không |và không \d. Nó có hiệu ứng ròng tương tự vì |là một phần của \Wnhưng |nó không hoạt động như bạn nghĩ. Thậm chí sau đó có nghĩa là nó chấp nhận _nhân vật. Có lẽ bạn đang tìm kiếm[^\W\d_]
OGHaza

Tôi đồng ý với bạn, nó chấp nhận _. Nhưng "KHÔNG" |bằng "VÀ", vì vậy [^\W|\d]có nghĩa là: KHÔNG \W KHÔNG\d
Motlab

12
[^ab]có nghĩa là không avà không b. [^a|b]có nghĩa là không avà không |và không b. Để cung cấp một ví dụ thứ hai [a|b|c|d]là chính xác giống như [abcd|||]đó là chính xác giống như [abcd|]- tất cả trong số đó tương đương với ([a]|[b]|[c]|[d]|[|])việc |là một ký tự chữ, không phải là một toán tử OR. Toán tử OR được ngụ ý giữa mỗi ký tự trong một lớp ký tự, đặt một |phương tiện thực tế mà bạn muốn lớp chấp nhận |ký tự (ống).
OGHaza

1

Gần đây tôi đã sử dụng mẫu này trong các biểu mẫu của mình để kiểm tra tên của mọi người, có chứa các chữ cái, khoảng trống và các ký tự đặc biệt như dấu trọng âm.

pattern="[A-zÀ-ú\s]+"

Bạn nên nhìn vào bảng ASCII. A-zkhông chỉ khớp với các chữ cái, cũng nhưÀ-ú
Toto

0

mẫu = / [a-zA-Z] /

đặt "[a-zA-Z]: # {mẫu.match (" hoa của tôi ")}" OK

đặt "[a-zA-Z]: # {pattern.match (" 456 ")}"

đặt "[a-zA-Z]: # {pattern.match (" ")}"

đặt "[a-zA-Z]: # {pattern.match (" # $% ^ & * ")}"

đặt "[a-zA-Z]: # {pattern.match (" # $% ^ & * A ")}" OK


3
Và còn về ví dụ, thì Zażółć gęslą jaźń 'thì sao?
Nhân chứng

-2
Pattern pattern = Pattern.compile("^[a-zA-Z]+$");

if (pattern.matcher("a").find()) {

   ...do something ......
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.