【问题标题】:Allow only letters and "special" letters (éèà etc.) through a regex通过正则表达式仅允许字母和“特殊”字母(éèà 等)
【发布时间】:2013-02-28 09:15:30
【问题描述】:

我正在尝试匹配一个字符串以查看它是否仅由字母组成。应允许使用各种字母。所以典型的a-zA-Z,还有áàéèó...等。

我尝试将其与以下正则表达式匹配:([\S])*

但这也允许使用\/<>*()... 等字符。这些显然是不属于名称的字符。当我只想允许字母和“特殊”字母时,正则表达式看起来如何?

【问题讨论】:

  • 因为如果它在 C# Javascript 中工作,它就不能只在 C# 中工作?但是好的,然后这个:Regex accent insensitive?,它也说“使用 \w+”。
  • All kinds of letters should be allowed:这是否意味着您也希望允许使用中文、韩文、泰文等字符?
  • CodeCaster, \w 对于几乎所有现实世界的使用来说都是可怕的。它允许字母、数字和下划线,在许多正则表达式引擎中,它不支持 Unicode,实际上只匹配 ASCII。它的意思是在 30 年前(猜测)作为匹配常见编程语言中的标识符的粗略快捷方式,它是处理实际文本的糟糕且几乎无用的选择。而且,基于\w\b 属于几乎没用的同一类。
  • CodeCaster,我收回之前的评论。他们实际上需要一个同时适用于 C# 和 JavaScript 的正则表达式,但从问题中并不明显(或者他们当时甚至不知道)。

标签: c# regex


【解决方案1】:

对于非正则表达式解决方案,您可以使用char.IsLetter

Char.IsLetter Method

指示指定的 Unicode 字符是否被归类为 字母。

string str = "Abcáàéèó";
bool result = str.All(char.IsLetter);

这将给出false 数字和\/<>*() 等结果。

【讨论】:

  • 由于他们试图使用允许正则表达式验证的工具来验证东西,我猜非正则表达式解决方案不会真正起作用。由于优雅,我仍然早先给了你+1,尽管组合字符仍然会失败(就像我最初的解决方案一样)。
【解决方案2】:

您可以使用确切说明的字符类:

\p{L}

所以正则表达式

^\p{L}+$

如果字符串仅包含字母,则匹配。如果您希望组合字符,那么

^(\p{L}\p{M}*)+$

有效。

快速 PowerShell 测试:

PS> 'foo','bär','a.b','&^#&%','123','кошка' -match '^\p{L}+$'
foo
bär
кошка

【讨论】:

  • 请注意,这允许使用任何语言(中文、韩文等)的字母,而不仅仅是基于拉丁语的脚本。
  • nhahtdh:嗯,是的,当他们说“应该允许各种字母”时,我就是这么理解的。
  • 如何处理代理? IE。像 U+0065 U+0301 (= “e” + “COMBINING ACUTE ACCENT” = é) 这样的东西匹配吗? (它适用于 OS X 'grep,我在这里专门询问 .NET。)
  • 康拉德,那些不是代理人;他们正在组合字符。但它在那些方面失败了;我会解决的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-19
相关资源
最近更新 更多