ChatGPT解决这个技术问题 Extra ChatGPT

正则表达式仅匹配字母

如何编写仅匹配字母的正则表达式?

您对 characters 的定义是什么? ASCII?汉子?异-XXXX-X? UTF8?
您对 regex 的定义是什么?珀尔?埃马克斯?格力普?
我注意到 \p{L} 表示字母和 /u 标志表示 Unicode 匹配我的正则表达式中的任何字母,即 /\p{L}+/u

G
Gumbo

使用字符集:[a-zA-Z] 匹配 A–Z 中的一个小写和大写字母。 [a-zA-Z]+ 匹配一个或多个字母,而 ^[a-zA-Z]+$ 仅匹配仅包含一个或多个字母的字符串(^$ 分别标记字符串的开始和结束)。

如果要匹配 A–Z 以外的其他字母,可以将它们添加到字符集中:[a-zA-ZäöüßÄÖÜ]。或者您使用预定义的字符类,例如描述作为字母的 Unicode 字符的 Unicode character property\p{L}


这是一个非常以 ASCII 为中心的解决方案。这将打破几乎所有非英语文本。
@Joachim Sauer:它宁愿打破使用非拉丁字符的语言。
90% 的德语文本都已中断,甚至不提法语或西班牙语。不过,意大利语可能仍然做得很好。
这取决于您选择的“拉丁字符”的定义。根据您的定义,J、U、Ö、Ä 都可以被认为是拉丁字符或不是拉丁字符。但它们都用于使用“拉丁字母”进行书写的语言中。
\p{L} 匹配所有变音符号 sedilla 重音等,所以你应该这样做。
R
RobV

如果您对拉丁字母以外的字母感兴趣,\p{L} 匹配任何 Unicode 字母


不是所有的正则表达式。例如,vim 正则表达式将 \p 视为“可打印字符”。
this page 建议仅 java、.net、perl、jgsoft、XML 和 XPath 正则表达式支持 \p{L}。但主要遗漏:python 和 ruby(尽管 python 有 regex 模块)。
@Philip Potter:Ruby 使用完全相同的语法支持 Unicode 字符属性。
我认为这应该是 \p{L}\p{M}*+ 来覆盖由多个代码点组成的字母,例如一个字母后跟重音符号。根据regular-expressions.info/unicode.html
JavaScript 在正则表达式之后需要 u 来检测 unicode 组:/\p{Letter}/gu
A
António Almeida

根据您对“字符”的含义:

[A-Za-z] - 所有字母(大写和小写)

[^0-9] - 所有非数字字符


我的意思是信件。它似乎没有工作。 preg_match('/[a-zA-Z]+/', $name);
[A-Za-z] 只是您可以使用的字符的声明。您仍然需要声明此声明必须使用多少次:[A-Za-z]{1,2}(匹配 1 或 2 个字母)或 [A-Za-z]{1,*}(匹配1 个或多个字母)
à, á, ã, Ö, Ä... 也是字母,অ, আ, ই, ঈ, Є, Ж, З, ﺡ, ﺥ, ﺩא, ב, ג, ש, ת, ... en.wikipedia.org/wiki/Letter_%28alphabet%29
@phuclv:确实,但这取决于编码,并且编码是程序设置的一部分(默认配置或程序配置文件中声明的配置)。当我研究不同的语言时,我曾经将它存储在一个常量中,在一个配置文件中。
@CatalinaChircu 编码在这里绝对无关紧要。编码是一种以二进制形式对字符集中的代码点进行编码的方法,例如 UTF-8 是 Unicode 的编码。字母 OTOH 取决于语言,如果说 [A-Za-z] 是字母,则必须指定正在使用的语言
b
blue_note

最接近的选项是

[\u\l]+

它匹配一系列大写和小写字母。但是,并非所有编辑器/语言都支持它,因此使用起来可能更安全

[a-zA-Z]+

正如其他用户建议的那样


但不会匹配任何特殊字符。
很长一段时间以来,我一直在使用 [Az]+,但只是注意到这允许一些特殊字符(如 ` 和 [ )滑入。 [a-zA-Z]+ 确实是要走的路。
P
Peter Mortensen

你会用

/[a-z]/gi

[]--检查给定输入之间的任何字符

az---覆盖整个字母表

g-----在整个字符串中全局

i-----获取大小写


W
Wiktor Stribiżew

爪哇:

String s= "abcdef";

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

它不包括变音符号,例如 ŹŻŚĄ
^ 或任何西里尔字母
Y
Yogesh Chauhan

很少有人写成“/^[a-zA-Z]$/i”的正则表达式是不正确的,因为最后他们提到了/i,这是不区分大小写的,在第一次匹配后它会返回。而不是 /i 只使用 /g 这是全局的,你也不需要把 ^ $ 用于开始和结束。

/[a-zA-Z]+/g

[a-z_]+ 匹配下面列表中的单个字符 量词:+ 一次到无限次之间,尽可能多次,根据需要返回 az 在 a 和 z 之间范围内的单个字符(区分大小写) AZ A 和 Z 之间的单个字符(区分大小写) g 修饰符:全局。所有比赛(第一场比赛不返回)


S
Scott Radcliff
/[a-zA-Z]+/

超级简单的例子。正则表达式在网上很容易找到。

http://www.regular-expressions.info/reference.html


R
Rohit Dubey

对于 PHP,以下将正常工作

'/^[a-zA-Z]+$/'

E
Eric Salina

在python中,我发现以下工作:

[^\W\d_]

这是有效的,因为我们正在创建一个新的字符类([]),它排除了(^)类 \W 中的任何字符(所有不在 [a-zA-Z0-9_] 中的字符),也排除了任何数字(\d)和也不包括下划线 (_)。

也就是说,我们采用了字符类 [a-zA-Z0-9_] 并删除了 0-9_ 位。您可能会问,写 [a-zA-Z] 而不是 [^\W\d_] 不是更容易吗?如果只处理 ASCII 文本,你会是正确的,但在处理 unicode 文本时:

\W 匹配任何不是单词字符的字符。这与 \w 正好相反。 > 如果使用 ASCII 标志,则它等效于 [^a-zA-Z0-9_]。

^ 来自 the python re module documentation

也就是说,我们将所有被认为是 unicode 中的单词字符,删除所有被认为是 unicode 中的数字字符,并删除下划线。

例如,下面的代码片段

import re
regex = "[^\W\d_]"
test_string = "A;,./>>?()*)&^*&^%&^#Bsfa1 203974"
re.findall(regex, test_string)

退货

['A', 'B', 's', 'f', 'a']

非拉丁字母呢?例如 çéàñ。您的正则表达式的可读性低于 \p{L}
聪明的回答。也适用于重音字母。
A
Amal Murali

只需使用 \w[:alpha:]。它是一个转义序列,仅匹配可能出现在单词中的符号。


\w 可能不是在所有情况下都是好的解决方案。至少在 PCRE 中,\w 也可以匹配其他字符。引用 PHP manual:““单词”字符是任何字母或数字或下划线字符,即可以成为 Perl“单词”一部分的任何字符。字母和数字的定义由PCRE 的字符表,如果进行特定于语言环境的匹配,可能会有所不同。例如,在“fr”(法语)语言环境中,一些大于 128 的字符代码用于重音字母,这些字符由 \w 匹配。< /i>”。
单词包括字母中的其他字符
\w 表示匹配字母和数字
T
Tomáš Nedělka

使用字符组

\D

匹配除数字 0-9 以外的任何字符

^\D+$

参见示例 here


这也将匹配空格、符号等,这似乎不是问题所要求的。
A
Amal Murali

如果您指的是任何字符编码中的任何字母,那么一个好的方法可能是删除非字母,如空格 \s、数字 \d 和其他特殊字符,如:

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

或者使用上述否定的否定来直接描述任何字母:

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

优点:

适用于所有正则表达式风格。

易于编写,有时可以节省大量时间。

缺点:

很长,有时并不完美,但字符编码也可能被破坏。


M
Motlab

您可以试试这个正则表达式:[^\W\d_][a-zA-Z]


这不是 [^\W|\d] 的意思
[^\W|\d] 表示不是 \W,也不是 |,也不是 \d。它具有相同的净效果,因为 |\W 的一部分,但 | 不像您想象的那样工作。即使这样,这也意味着它接受 _ 字符。您可能正在寻找 [^\W\d_]
我同意你的看法,它接受 _。但是“NOT”| 等于“AND”,所以 [^\W|\d] 表示:NOT \W AND NOT \d
[^ab] 表示不是 a 也不是 b[^a|b] 表示不是 a,也不是 |,也不是 b。举第二个例子,[a|b|c|d][abcd|||] 完全相同,它与 [abcd|] 完全相同 - 所有这些都等同于 ([a]|[b]|[c]|[d]|[|])| 是文字字符,而不是 OR 运算符。 OR 运算符隐含在字符类中的每个字符之间,放置一个实际的 | 意味着您希望该类接受 |(管道)字符。
J
Javi Marzán

所以,我一直在阅读很多答案,其中大多数都没有考虑例外情况,比如带有重音符号或分音符号的字母(á、à、ä 等)。

我在 typescript 中创建了一个函数,它应该几乎可以外推到任何可以使用 RegExp 的语言。这是我在 TypeScript 中的用例的个人实现。我基本上所做的就是用我想添加的每种符号添加一系列字母。在应用 RegExp 之前,我还将 char 转换为大写,这为我节省了一些工作。

function isLetter(char: string): boolean {
  return char.toUpperCase().match('[A-ZÀ-ÚÄ-Ü]+') !== null;
}

如果您想添加另一个带有另一种重音的字母范围,只需将其添加到正则表达式即可。特殊符号也是如此。

我用 TDD 实现了这个功能,我可以确认它至少适用于以下情况:

    character | isLetter
    ${'A'}    | ${true}
    ${'e'}    | ${true}
    ${'Á'}    | ${true}
    ${'ü'}    | ${true}
    ${'ù'}    | ${true}
    ${'û'}    | ${true}
    ${'('}    | ${false}
    ${'^'}    | ${false}
    ${"'"}    | ${false}
    ${'`'}    | ${false}
    ${' '}    | ${false}

c
cblnpa

最近我在我的表单中使用这种模式来检查人名,包括字母、空格和特殊字符,如重音符号。

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

您应该查看 ASCII 表。 A-z 不仅匹配字母,还匹配 À-ú
P
Predrag Davidovic

JavaScript

如果要返回匹配的字母:

('Example 123').match(/[A-Z]/gi) // 结果:[“E”、“x”、“a”、“m”、“p”、“l”、“e”]

如果您想用星号 ('*') 替换匹配的字母,例如:

('Example 123').replace(/[A-Z]/gi, '*') //结果:"****** 123"*


对于英语以外的字母:/\p{Letter}/gu 参考:developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/…
j
jarraga
/^[A-z]+$/.test('asd')
// true

/^[A-z]+$/.test('asd0')
// false

/^[A-z]+$/.test('0asd')
// false

你好@jarraga。欢迎来到 SO,did you read how to answer a question?。它应该有助于清除您的答案,从而避免投票。
S
Snm Maurya

模式 = /[a-zA-Z]/

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

提出“[a-zA-Z]:#{pattern.match("456")}”

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

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

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


例如,“Zażółć gęslą jaźń”又如何呢?
A
Alan Moore
Pattern pattern = Pattern.compile("^[a-zA-Z]+$");

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

   ...do something ......
}