如何使用正则表达式匹配西里尔字母

89

我该如何用正则表达式匹配法语和俄语西里尔字母的字符? 我只想匹配字母,不包括数字或特殊字符。 目前我有:

[A-Za-z]


1
请查看此问题:正则表达式和Unicode - user151323
4
这是:[А-Яа-я] - Alex Erygin
14
对于仅包含俄语字符,正则表达式为:**[ЁёА-я]**(其中 А 是俄语字母)。俄语字母 а 的 Unicode 代码紧随在 Я 后面,因此您不需要使用两个范围。字母 Ёё 的 Unicode 代码不在 А-я 范围内,因此您需要单独指定。 - CITBL
11个回答

64

如果你的regex引擎支持Unicode块[\p{IsCyrillic}]),你可以使用以下正则表达式匹配西里尔语字符:

[\p{IsCyrillic}] or [\p{Cyrillic}]

否则尝试使用:

[U+0400–U+04FF]

对于PHP,请使用:

[\x{0400}-\x{04FF}]

解释:

[\p{IsCyrillic}]

Match a character from the Unicode block "Cyrillic" (U+0400–U+04FF) «[\p{IsCyrillic}]»

注意:

[U+0400–U+04FF]的Unicode字符列表和数字HTML实体。


这个线程解释了如何在C#中匹配西里尔字母符号。https://dev59.com/31zUa4cB1Zd3GeqP5auu - Dmitry Pavlov
@black 你使用哪种编程语言? - Pedro Lobito
我正在使用PHP。 - Black
对于 php,请尝试使用 [\x{0400}-\x{04FF}]。https://regex101.com/r/zcRenT/1 - Pedro Lobito
PHP支持\p{Cyrillic},你只需要确保在正则表达式上添加u标志。 - donatJ

46

这取决于你使用的正则表达式引擎。如果它支持Unicode字符类(例如.NET),\p{L}匹配任何字符集中的字母字符。


1
用Java怎么样? - IgorGanapolsky
1
这将匹配任何西里尔字母,包括那些不在俄语西里尔字母表中的字母(Greg 询问了俄语西里尔字母)。 - CITBL
1
在Javascript中,您还需要添加标志'u'。请参阅https://javascript.info/regexp-unicode。 - Orlin
注意:目前JavaScript中的p{L}在Safari中无法使用。 - Adam Šipický

29

要匹配仅俄语西里尔字母,请使用:

[\u0401\u0451\u0410-\u044f]

这相当于:

[ЁёА-я]

其中А是西里尔字母,不是拉丁字母(尽管看起来相同但它们有不同的代码)

\p{IsCyrillic}, \p{Cyrillic}, [\u0400-\u04FF]这些被其他人建议的方式将匹配所有西里尔字母变种,而不仅仅是俄语。


11

如果您使用现代版本的PHP - 只需:

preg_match("/^[\p{L}]+$/u");

不要忘记添加u标志来支持Unicode!


2
你能解释一下你的正则表达式吗?我用Бори́с试了一下,但是没有匹配成功,所以你的正则表达式不起作用。 - Black
很简单,请看:https://www.php.net/manual/en/regexp.reference.unicode.php “L”表示任何字母。 因此,“и́”符号应该在其他组中!请尝试找到它。 - Олег Всильдеревьев

6

用于匹配西里尔字母和正常(英语)字母的正则表达式:

^[A-Za-z.!@?#"$%&:;() *\+,\/;\-=[\\\]\^_{|}<>\u0400-\u04FF]*$

它可以匹配特殊字符、西里尔字母和英文字母。


2
非英文字母不是正常的吗?更不用说只有一个英文字母了。 - CITBL

5

这对我有用

[a-z\u0400-\u04FF]

2
仅匹配 Cyrillic 字符请使用 [\u0400-\u04FF] - Boykodev

5

在各种正则表达式方言中,[:alpha:] 用于表示当前语言环境下的任何字母数字字符。(您可能需要将其放入字符类中,例如 [[:alpha:]]。)


这在PostgreSQL中也适用,但匹配所有国际字符(而不仅仅是当前区域设置)。您还可以使用 [[:lower:]][[:upper:]] 来匹配特定的大小写。例如,替换小写字符:regexp_replace(firstname, '[[:lower:]]', 'a', 'g') - Nux

2
如果你使用Elixir:
String.match?(string, ~r/^\p{Cyrillic}*$/u)

您需要添加u标志以支持Unicode。

1
注意,上面的正则表达式对于空字符串返回trueString.match?("", ~r/^\p{Cyrillic}*$/u) => true。你应该将*修饰符改为+来解决这个问题。 - belgoros

2
您可以使用首字母和尾字母。例如在保加利亚语中:
[А-я]+

0

对于现代 PHP(来源):

$string = 'тест тест Тест Обязателльно Stackoverflow >!<';
var_dump(preg_replace('/[\x{0410}-\x{042F}]+.*[\x{0410}-\x{042F}]+/iu', '', $string));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接