【问题标题】:Match alphanumeric characters, including latin unicode匹配字母数字字符,包括拉丁 unicode
【发布时间】:2017-04-10 15:46:17
【问题描述】:

我有一个匹配 ASCII 字母数字字符的有效正则表达式:

 string pattern = "^[a-zA-Z0-9]+$";
 Match match = Regex.Match(input, pattern);
 if (match.Success)
 {
   ...

我想扩展它以应用相同的概念,但包括所有拉丁字符(例如 å、Ø 等)。

我读过unicode scripts。我试过这个:

 string pattern = "^[{Latin}0-9]+$";

但它与我期望的模式不匹配。如何使用 unicode 脚本或其他方法匹配拉丁 unicode?​​p>

【问题讨论】:

标签: c# regex


【解决方案1】:

.NET 正则表达式引擎不支持 Unicode 脚本,但 Unicode 块支持。话虽如此,您可以使用以下正则表达式匹配所有拉丁字符:

^[\p{IsBasicLatin}\p{IsLatin-1Supplement}\p{IsLatinExtended-A}\p{IsLatinExtended-B}0-9]+$
  • \p{IsBasicLatin}:U+0000–U+007F
  • \p{IsLatin-1Supplement}:U+0080–U+00FF
  • \p{IsLatinExtended-A}:U+0100–U+017F
  • \p{IsLatinExtended-B}:U+0180–U+024F

或者干脆使用^[\u0000-\u024F0-9]+$

@AnthonyFaull 提到,您可能还需要考虑匹配 \p{IsLatinExtendedAdditional},它是 U+1E00-U+1EFF 的命名块,包含 256 个附加字符:

[ắẮằẰẵẴẳẲấẤầẦẫẪẩẨảẢạ ẠặẶậẬḁḀ ẚ ḃḂḅḄḇḆ ḉḈ ḋḊḑḐḍḌḓḒḏḎ ẟ ếẾềỀễỄểỂẽẼḝḜḗḖḕḔẻẺẹẸ ệỆḙḘḛḚ ḟḞ ḡḠ ḧḦḣḢḩḨḥḤḫḪẖ ḯḮỉỈịỊḭḬ ḱḰḳḲḵḴ ḷḶḹḸḽḼḻḺ ỻỺ ḿḾṁṀṃṂ ṅṄṇṆṋṊṉṈ ốỐồỒỗỖổỔṍṌṏṎṓṒṑṐỏỎớỚ ờỜỡỠởỞợỢọỌộỘ ṕṔṗṖ ṙṘṛṚṝṜṟṞ ṥṤṧṦṡṠṣṢṩṨẛ ẞ ẜ ẝ ẗṫṪṭṬṱṰṯṮ ṹṸṻṺủỦứỨừỪữỮửỬựỰụỤṳṲ ṷṶṵṴ ṽṼṿṾ ỽỼ ẃẂẁẀẘẅẄẇẆẉẈ ẍẌẋẊ ỳỲẙỹỸẏẎỷỶỵỴ ỿỾ ẑẐẓẒẕẔ]

【讨论】:

  • 很好的答案。您不妨添加\p{IsLatinExtendedAdditional}
  • @AnthonyFaull 谢谢。已添加。
【解决方案2】:

使用 ^[\p{L}\s]+$ 匹配任何 unicode 字符

^[\w\u00c0-\u017e]$ 匹配从 00c0 到 017e 的任何字母加 unicode 字符(使用charmap 查找所需的unicode 字符范围)

Sample on regex101

【讨论】:

  • @mtmacdonald 您需要使用verbatim strings (@"...") 或转义反斜杠。
  • @stej4n 为什么在您的第二个示例中,当 ASCII 字母字符低于 00C0 范围时,它们会包含在匹配项中?
  • 因为我添加了匹配 ASCII 字符的 \w
【解决方案3】:

我将使用 unicode 脚本。

如 Wikipedia (https://en.wikipedia.org/wiki/Latin_script_in_Unicode) 所述,我将使用 Latin-1 Supplement (00C0-00FF)、Latin Extended-A (0100–017F)、Latin Extended-B (0180–024F) 和您的 ASCII 模式字母数字字符。

string pattern = "^[a-zA-Z0-9\\u00C0–\\u024F]+$";

【讨论】:

  • 123Æ 不匹配?
猜你喜欢
  • 2017-12-01
  • 2013-02-21
  • 1970-01-01
  • 2014-08-19
  • 1970-01-01
  • 2014-06-06
  • 1970-01-01
  • 2011-10-15
  • 1970-01-01
相关资源
最近更新 更多