Wyrażenie regularne, aby dopasować tylko znaki alfabetu

157

Zastanawiałem się, czy uda mi się uzyskać wyrażenie regularne, które będzie pasowało do łańcucha zawierającego tylko znaki alfabetu i tylko to.

Steffan Harris
źródło
2
Coś w rodzaju / ^ [a-zA-Z] + $ / powinno działać.
Julian Go
10
Czy àznak alfabetu odpowiada Twojej definicji? Jakiego języka używasz?
Tim Pietzcker
2
czy powinien pasować pusty ciąg?
ysth
nie, pusty ciąg nie powinien pasować
Steffan Harris
Jedna ważna uwaga: nie poleciłeś języka ani narzędzia, w którym chcesz użyć wyrażenia regularnego, o które prosisz. Chociaż zasady wyrażeń regularnych są ogólnie takie same, składnia nie jest wszędzie jednakowa. Powinieneś odnieść się, gdzie chcesz go użyć.
sergiol

Odpowiedzi:

186

Możesz użyć dowolnego z tych 2 wariantów:

/^[A-Z]+$/i
/^[A-Za-z]+$/

aby dopasować wejściowy ciąg alfabetów ASCII.

  • [A-Za-z] dopasuje wszystkie alfabety (zarówno małe, jak i duże).
  • ^i $upewni się, że nic poza tymi alfabetami nie zostanie dopasowane.

Kod:

preg_match('/^[A-Z]+$/i', "abcAbc^Xyz", $m);
var_dump($m);

Wynik:

array(0) {
}

Przypadek testowy dotyczy komentarza OP, który chce dopasować tylko wtedy, gdy w danych wejściowych występuje 1 lub więcej alfabetów. Jak widać w przypadku testowym, dopasowanie nie powiodło się, ponieważ znajdował się ^w ciągu wejściowym abcAbc^Xyz.

Uwaga: należy pamiętać, że powyższa odpowiedź jest zgodna tylko z alfabetami ASCII i nie obejmuje znaków Unicode. Jeśli chcesz dopasować litery Unicode, użyj:

/^\p{L}+$/u

Tutaj \p{L}pasuje do każdego rodzaju listu z dowolnego języka

anubhava
źródło
22
W niektórych dialektach [Az] będzie pasować do wartości interpunkcyjnych ASCII występujących między 'Z' i 'a', w szczególności '[', '\', ']', '^', '-' i '`', jak a także od „A” do „Z” i od „a” do „z”.
Lee
Tak naprawdę chciałem dopasować mój ciąg tylko wtedy, gdy ma znaki alfabetu, jeśli ma znak niealfabetyczny, nie powinien pasować.
Steffan Harris
7
@Lee: Nie niektóre. Wszyscy. To wyrażenie regularne jest nieprawidłowe w obecnym stanie.
Tim Pietzcker
7
\w is shorthand for A-Za-z- nie bardzo, \wjest skrótem od[a-zA-Z0-9_]
anubhava
1
Słuszna uwaga @ jpmc26. Zmieniłem odpowiedź, aby usunąć pierwotny błąd.
anubhava,
55

Jeśli potrzebujesz dołączyć znaki alfabetu spoza ASCII, a Twój typ wyrażenia regularnego obsługuje Unicode, to

\A\pL+\z

byłoby poprawnym wyrażeniem regularnym.

Niektóre aparaty regex nie obsługują tej składni Unicode, ale pozwalają \wskrótom alfanumerycznym na dopasowanie również znaków spoza ASCII. W takim przypadku możesz uzyskać wszystkie alfabety, odejmując cyfry i podkreślenia w \wten sposób:

\A[^\W\d_]+\z

\Adopasowuje na początku łańcucha, \zna końcu łańcucha ( ^a $także dopasowuje na początku / końcu linii w niektórych językach, takich jak Ruby, lub jeśli są ustawione określone opcje wyrażeń regularnych).

Tim Pietzcker
źródło
38
+1 za nie traktowanie alfabetu angielskiego jako jedynego alfabetu
srcspider
7
+1, tak samo jak powyżej. angielski nie jest jedynym alfabetem i wiele osób pisze swoje imię używając znaków innych niż ASCII, aby poprawnie je wyrazić.
Ben Barkay
22

Dopasuje jeden lub więcej znaków alfabetu:

/^[a-z]+$/

Możesz sprawić, by wielkość liter nie była rozróżniana, używając:

/^[a-z]+$/i

lub:

/^[a-zA-Z]+$/
stevecomrie
źródło
Dopasuje tylko znaki łacińskie.
cytuje Brat
13

W Ruby i innych językach, które obsługują klasy znaków POSIX w wyrażeniach nawiasów, możesz po prostu:

/\A[[:alpha:]]+\z/i

Spowoduje to dopasowanie znaków alfa we wszystkich językach alfabetu Unicode. Bułka z masłem.

Więcej informacji: http://en.wikipedia.org/wiki/Regular_expression#Character_classes http://ruby-doc.org/core-2.0/Regexp.html

jshkol
źródło
1
Aby uzyskać wszystko oprócz tych znaków (które nie zostały udokumentowane), używają [^[:alpha]].
spyle
6

[a-zA-Z] powinien zrobić to dobrze.

Możesz odwołać się do ściągawki .

Frazell Thomas
źródło
2
tak, ale zrobiłbym również, gdyby mój ciąg zawierał znak inny niż słowo, nadal by pasował
Steffan Harris