Regex para corresponder apenas às letras


374

Como posso escrever uma regex que corresponda apenas a letras?


58
Qual é a sua definição characters? ASCII? Kanji? ISO-XXXX-X? UTF8?
Ivo Wetzel

45
Qual é a sua definição regex? Perl? Emacs? Grep?
Pascal Cuoq 01/09/10

4
Dado que a pergunta está em inglês, em um site em inglês, é justo supor que a pergunta se refere a caracteres em inglês.
vaer-k 17/07/19

11
Eu notei que \ p {L} para uma letra e / u sinalizador para o Unicode corresponde a qualquer letra no meu regex, ou seja, /\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. Isso é verdade. Como todos sabemos, os falantes de inglês NUNCA localizam suas aplicações!
Alex

Respostas:


392

Use um conjunto de caracteres: [a-zA-Z]corresponde a uma letra de A – Z em minúsculas e maiúsculas. [a-zA-Z]+corresponde a uma ou mais letras e ^[a-zA-Z]+$corresponde apenas a seqüências que consistem em apenas uma ou mais letras ( ^e $marca o início e o fim de uma sequência, respectivamente).

Se você quiser combinar outras letras que A-Z, você pode adicioná-los ao conjunto de caracteres: [a-zA-ZäöüßÄÖÜ]. Ou você usa classes de caracteres predefinidas, como a classe de propriedade de caracteres Unicode,\p{L} que descreve os caracteres Unicode que são letras.


119
Essa é uma solução muito centrada em ASCII. Isso interromperá praticamente qualquer texto que não seja em inglês.
Joachim Sauer

7
@Joachim Sauer: Ele prefere quebrar idiomas usando caracteres não latinos.
Gumbo

15
Já quebra 90% do texto em alemão, nem menciona francês ou espanhol. O italiano ainda pode se sair muito bem.
Ivo Wetzel

9
isso depende da definição de "caractere latino" que você escolher. J, U, Ö, Ä podem ser considerados caracteres latinos ou não, com base em sua definição. Mas todos eles são usados ​​em idiomas que usam o "alfabeto latino" para escrever.
Joachim Sauer

9
\ p {L} corresponde a todos os acentos de trema, etc, então você deve concordar com isso.
Radu Simionescu

198

\p{L} corresponde a qualquer letra que seja Unicode se você estiver interessado em alfabetos além do latim


2
não em todos os sabores de regex. Por exemplo, as expressões regulares do vim são tratadas \pcomo "Caractere imprimível".
Philip Potter

3
esta página sugere apenas os regexes java, .net, perl, jgsoft, XML e XPath suportados \ p {L}. Mas grandes omissões: python e ruby ​​(embora python tenha o módulo regex).
Philip Potter

6
@ Philip Potter: Ruby suporta propriedades de caracteres Unicode usando exatamente a mesma sintaxe.
Jörg W Mittag

6
Eu acho que isso deve ser \p{L}\p{M}*+para cobrir cartas compostas de vários pontos de código, por exemplo, uma letra seguida por acentos. Como por regular-expressions.info/unicode.html
ZoFreX

com o pitão 3 este produz um errobad escape \p at position 0
matanster

46

Dependendo do seu significado de "personagem":

[A-Za-z]- todas as letras (maiúsculas e minúsculas)

[^0-9] - todos os caracteres que não são dígitos


Eu quis dizer letras. Não parece estar funcionando embora. preg_match ('/ [a-zA-Z] + /', $ nome);
Nike

[A-Za-z] é apenas a declaração de caracteres que você pode usar. Você ainda precisa declarar quantas vezes essa declaração deve ser usada: [A-Za-z] {1,2} (para corresponder a 1 ou 2 letras) ou [A-Za-z] {1, *} (para corresponder 1 ou mais letras)
KristofMols 01/09/10

17
bem à, á, ã, Ö, Ä ... também são letras, assim como অ, আ, ই, ঈ, Є, Ж, З, ﺡ, ﺥ, ﺩ א, ב, ג, ש, ת, ... pt.wikipedia.org/wiki/Letter_%28alphabet%29
phuclv 20/09/16

@ phuclv: De fato, mas isso depende da codificação, e a codificação faz parte das configurações do programa (a configuração padrão ou a declarada em um arquivo de configuração do programa). Quando trabalhei em diferentes idiomas, costumava armazenar isso em uma constante, em um arquivo de configuração.
Catalina Chircu 14/10/19

11
A codificação @CatalinaChircu é absolutamente irrelevante aqui. Codificação é uma maneira de codificar um ponto de código em um conjunto de caracteres em binário, por exemplo, UTF-8 é uma codificação para Unicode. Cartas OTOH depende do idioma, e se alguém diz que [A-Za-z]são letras, em seguida, o idioma que está sendo usado deve ser especificado
phuclv

32

A opção mais próxima disponível é

[\u\l]+

que corresponde a uma sequência de letras maiúsculas e minúsculas. No entanto, não é suportado por todos os editores / idiomas, portanto, provavelmente é mais seguro usar

[a-zA-Z]+

como outros usuários sugerem


11
Porém, não corresponde a nenhum caractere especial.
Nyerguds

20

Você usaria

/[a-z]/gi

[] - verifica se há caracteres entre as entradas fornecidas

az --- cobre todo o alfabeto

g ----- globalmente em toda a cadeia

i ----- ficando em maiúsculas e minúsculas


14

A expressão regular que poucas pessoas escreveram como "/ ^ [a-zA-Z] $ / i" não está correta, porque no final mencionaram / i, o que é sensível a maiúsculas e minúsculas e após a correspondência pela primeira vez, ele retornará. Em vez de / i, basta usar / g, que é global e você também não precisa colocar ^ $ para iniciar e terminar.

/[a-zA-Z]+/g
  1. [a-z _] + corresponde a um único caractere presente na lista abaixo
  2. Quantificador: + Entre uma e várias vezes, quantas vezes for possível, devolvendo conforme necessário
  3. az um único caractere no intervalo entre a e z (diferencia maiúsculas de minúsculas)
  4. AZ um único caractere no intervalo entre A e Z (diferencia maiúsculas de minúsculas)
  5. modificador g : global. Todas as partidas (não retorne na primeira partida)

13

Java:

String s= "abcdef";

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

4
ele não inclui sinais diacríticos comoŹŻŚĄ
karolus



7

Use grupos de caracteres

\D

Corresponde a qualquer caractere, exceto os dígitos de 0 a 9.

^\D+$

Veja o exemplo aqui


8
Isso também corresponderá a espaços em branco, símbolos etc., que não parecem ser o que a pergunta está pedindo.
DaveMongoose

Esquisito. Só tenho um voto negativo sobre isso, e não sou eu!
21818 Dave Everitt

6

Basta usar \wou [:alpha:]. É uma sequência de escape que corresponde apenas aos símbolos que podem aparecer em palavras.


9
\wpode não ser uma boa solução em todos os casos. Pelo menos no PCRE, também \wpode corresponder a outros caracteres. Citando o manual do PHP : " A" palavra "caractere é qualquer letra ou dígito ou o caractere sublinhado, ou seja, qualquer caractere que possa fazer parte de uma" palavra "Perl. A definição de letras e dígitos é controlada pelas tabelas de caracteres do PCRE, e pode variar se a correspondência específica de local estiver ocorrendo. Por exemplo, no local "fr" (francês), alguns códigos de caracteres maiores que 128 são usados ​​para letras acentuadas e correspondem a \ w ".
Amal Murali

palavras incluem caracteres de outras letras
V-SHY

2
\wsignifica letras e números correspondentes
Eugen Konkov 26/08

4

Se você quer dizer letras em qualquer codificação de caracteres, uma boa abordagem pode ser excluir não letras, como espaços \s, dígitos \de outros caracteres especiais, como:

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

Ou use a negação acima para descrever diretamente qualquer letra:

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

Prós:

  • Funciona com todos os sabores de regex.
  • Fácil de escrever, às vezes economiza muito tempo.

Contras:

  • Longo, às vezes não perfeito, mas a codificação de caracteres também pode ser quebrada.

4

Você pode tentar esta expressão regular: [^\W\d_]ou [a-zA-Z].


Isso não é o que [^\W|\d]significa #
020 OGHaza

11
[^\W|\d]significa não \We não |e não \d. Ele tem o mesmo efeito líquido desde que |faz parte, \Wmas |não funciona como você pensa. Mesmo assim, isso significa que ele aceita o _personagem. Você provavelmente está procurando[^\W\d_]
OGHaza

Eu concordo com você, ele aceita o _. Mas "NOT" |é igual a "AND", então [^\W|\d]significa: NOT \W AND NOT\d
Motlab

12
[^ab]significa não ae não b.[^a|b]significa não ae não |e não b. Dar um segundo exemplo [a|b|c|d]é exatamente o mesmo [abcd|||]que é exatamente o mesmo [abcd|]- todos os quais equivalem ([a]|[b]|[c]|[d]|[|])a |é um caractere literal, não um operador OR. O operador OR está implícito entre cada caractere em uma classe de caractere, colocando um |meio real de que você deseja que a classe aceite o |caractere (canal).
OGHaza

1

Ultimamente, tenho usado esse padrão em meus formulários para verificar nomes de pessoas, contendo letras, espaços em branco e caracteres especiais, como sinais de destaque.

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

Você deve olhar para uma tabela ASCII. A-zcombina mais do que apenas letras, bem comoÀ-ú
Toto

0

padrão = / [a-zA-Z] /

coloca "[a-zA-Z]: # {pattern.match (" mine blossom ")}" "OK

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

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

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

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


3
E o que dizer, por exemplo, “Zażółć gęslą jaźń”?
The Witness

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

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

   ...do something ......
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.