【问题标题】:Regex matching letter characters [duplicate]正则表达式匹配字母字符[重复]
【发布时间】:2013-06-03 13:40:45
【问题描述】:

我有这个正则表达式:

if (cadena.matches("^[a-zA-Z ]+$")) return true;

它接受从 A 到 Z 的小写和大写。也接受空格。

但这仅适用于英语。例如,在加泰罗尼亚语中,我们有“ç”字符。我们也有带有“á”或“à”等的字符。

用谷歌搜索,我找不到任何方法。

我发现我可以过滤 UTF-8 但这会接受不是真正字母的字符。

我该如何实现?

【问题讨论】:

标签: java regex unicode


【解决方案1】:

使用这个正则表达式:

[\p{L}\s]+

\p{L} 表示任何 Unicode 字母。

fiddle.re Demo.

【讨论】:

  • 这不也匹配非拉丁字符,这不是 OP 正在寻找的(即使他们确实接受了这个答案)?例如,它匹配안녕。如果您特别想匹配拉丁字符 (ref),\p{IsLatin} 似乎更合适。
  • @NickChammas:op 明确希望匹配任何 Unicode 字母。
  • 在事实发生 3 年后的这一点上,我认为这是一个有争议的问题 ? 但 OP 的标题和匹配加泰罗尼亚字母表的预期用例表明他们只想匹配拉丁字符而不是所有 Unicode(其中将包括其他字母,如韩语)。我没有看到 OP 明确想要匹配“任何 Unicode 字母”的位置。但无论如何,我赞成这个答案,因为它很有帮助。我希望我之前的评论可以帮助像我一样来到此页面寻找仅匹配拉丁字符而不是任何 Unicode 的方法的其他人。
  • 详细说明一下,以防引起混淆,拉丁语!= ASCII。大多数拉丁字符,如ëɶ,只能是represented by Unicode\p{IsLatin} 将匹配这些字符,而不匹配来自其他非拉丁字母的字符。
  • 最佳解决方案??
【解决方案2】:

查看documentation 并使用一个类(例如\p{InLATIN_1_SUPPLEMENT})。

【讨论】:

  • 本文档页面在任何地方都没有提到Latin1Supplemental。即使在site:oracle.com 上搜索Latin1Supplemental 也找不到它。什么给了?
  • 它可以被命名为不同的东西。请查看Character.UnicodeBlock 的文档。有一个名为LATIN_!_SUPPLEMENTAL 的常量,该名称可用于\p{} 名称。
  • 这应该是:Pattern.compile("\\p{InLATIN_1_SUPPLEMENT}")。注意Character.UnicodeBlock 常量之前的In。来自“掌握正则表达式”:“支持 Unicode 块,需要一个‘In’前缀。”
  • @StefanvandenAkker 你是对的。我更正了我的答案。
  • @UwePlonus 抱歉,仍然无法编译。根据idNamealiases 取自Character.UnicodeBlock.LATIN_1_SUPPLEMENT,它应该是\p{InLATIN_1_SUPPLEMENT}\p{InLATIN-1 SUPPLEMENT}\p{InLATIN-1SUPPLEMENT}
猜你喜欢
  • 2011-08-29
  • 1970-01-01
  • 2016-10-24
  • 1970-01-01
  • 2011-01-09
  • 2011-04-06
  • 1970-01-01
  • 2023-03-09
相关资源
最近更新 更多