我的正则表达式如何支持多种语言,如中文,日语,法语等

问题描述 投票:0回答:2

我是java脚本新手。我编写了一个正则表达式,它允许用户名或电子邮件地址作为输入,并具有一些条件,例如 应接受 6-50 个字符 不允许有空格或空白 不应允许 2 个

@
符号,并且可以接受超过 1 个
.
(点)和
_
(下划线)。
这是我的正则表达式。

var regExpPattern = /^(?=.{6,50}$)([\w._]+@?[\w.]*)$/;

任何人都可以告诉我如何让我的正则表达式支持多种语言,如西班牙语、中文、法语等。 非常感谢。

javascript regex
2个回答
0
投票

要覆盖其他语言,您可以使用特殊字符的 Unicode 代码/范围。

以日语为例(使用 Perl):

if ($text =~ m/[\x{3041}-\x{3096}]/) { print $text; }

这会找到文本字符串中的所有平假名,Unicode 代码范围为:[\x3041-\x3096]

所以它会在字符串中找到其中的任何一个:

ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっ つづてでとどなにぬねのはばひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆ ょよらりるれろゎわゐゑをんゔゕゖ゙゚゛゜ゝゞゟ

尝试一下 RegexPal 例如,这个:

\u3041

在上面这组平假名上,会发现:

其他语言也是如此。


0
投票

仅对于英语,您可以使用简单的字符类,例如

/^[a-zA-Z0-9_\.]+$/
,相当于使用单词 char
/^[\w\.]+$/
。以下是支持多种语言中单词字符的 Unicode 等效项:

/^[\p{L}\p{M}\.]+$/u

说明:

  • 使用
    u
    标志
  • 启用 Unicode
  • \p{L}
    - 表示任何语言中的字母字符
  • \p{M}
    - 表示标记(重音符号等)

您可能还想包含一个国际破折号字符,相当于仅英语

/^[\w\.\-]+$/

/^[\p{L}\p{M}\.\p{Pd}]+$/u

因此,支持国际字符的正则表达式将类似于:

/^(?=.{6,50}$)(?=[^@]*@?[^@]*$)[\p{L}\p{M}\.\p{Pd}]+$/u

说明:

  • 使用
    u
    标志
  • 启用 Unicode
  • ^
    - 字符串的开头
  • (?=.{6,50}$)
    - 6 到 50 个字符的正向前瞻,锚定到字符串末尾
  • (?=[^@]*@?[^@]*$)
    - 零个或一个
    @
    字符的正向前瞻,锚定到字符串末尾
  • []+
    - 具有以下一个或多个字符的字符类:
    • \p{L}
      - 任何语言中的字母字符
    • \p{M}
      - 标记(重音等)
    • \.
      - 一个字面点
    • \p{Pd}
      - 国际短划线字符
  • $
    - 字符串结尾

请参阅有关 Unicode 正则表达式的文档:https://javascript.info/regexp-unicode

© www.soinside.com 2019 - 2024. All rights reserved.