域名正则表达式包括 IDN 字符 c#

A.G*_*far 1 c# regex idn web

我希望我的域名不包含超过一个连续的(.)\'/\'任何其他特殊字符。但它可以包含 IDN 字符,例如\xc3\x81, \xc5\x9b, etc... 我可以使用此正则表达式来满足所有要求(IDN 除外):

\n\n
@"^(?:[a-zA-Z0-9][a-zA-Z0-9-_]*\\.)+[a-zA-Z0-9]{2,}$";\n
Run Code Online (Sandbox Code Playgroud)\n\n

问题是这个正则表达式也拒绝 IDN 字符。我想要一个允许 IDN 字符的正则表达式。我做了很多研究,但我无法弄清楚。

\n

ctw*_*els 5

简短的

\n\n

Regex 包含一个字符类,允许您指定 Unicode 常规类别\\p{}。MSDN正则表达式文档包含以下内容:

\n\n
\n

\\p{ name }匹配 Unicode 常规类别或由名称指定的命名块中的任何单个字符。

\n
\n\n

另外,作为旁注,我注意到你的正则表达式包含一个未转义的.. 在正则表达式中,点字符.具有任何字符的特殊含义(换行符除外,除非另有说明)。您可能需要将其更改为\\.以确保功能正常。

\n\n
\n\n

代码

\n\n

编辑现有代码以包含 Unicode 字符类而不仅仅是 ASCII 字母,您应该获得以下效果:

\n\n
^(?:[\\p{L}\\p{N}][\\p{L}\\p{N}-_]*.)+[\\p{L}\\p{N}]{2,}$\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

解释

\n\n
    \n
  • \\p{L}表示任何语言/脚本中任何字母的 Unicode 字符类
  • \n
  • \\p{N}代表任何语言/脚本中任何数字的 Unicode 字符类(根据您的字符示例,您可能可以保留0-9,但我想我会向您展示一般概念并为您提供一些额外的信息)
  • \n
\n\n

该站点提供了最常用的 Unicode 类别的快速总体概述。

\n\n
\n
    \n
  • \\p{L}\\p{Letter}: 来自任何语言的任何类型的字母。\n \n
      \n
    • \\p{Ll}\\p{Lowercase_Letter}:具有大写变体的小写字母。
    • \n
    • \\p{Lu}\\p{Uppercase_Letter}:具有小写变体的大写字母。
    • \n
    • \\p{Lt}\\p{Titlecase_Letter}:仅当单词的第一个字母大写时出现在单词开头的字母。
    • \n
    • \\p{L&}\\p{Cased_Letter}:存在小写和大写变体的字母(Ll、Lu 和 Lt 的组合)。
    • \n
    • \\p{Lm}\\p{Modifier_Letter}:像字母一样使用的特殊字符。
    • \n
    • \\p{Lo}\\p{Other_Letter}:没有小写和大写变体的字母或表意文字。
    • \n
  • \n
  • \\p{M}\\p{Mark}:要与另一个字符组合的字符(例如重音符号、变音符号、封闭框等)。\n \n
      \n
    • \\p{Mn}或者\\p{Non_Spacing_Mark}:用于与另一个字符组合而不占用额外空间的字符(例如\n 重音符号、变音符号等)。
    • \n
    • \\p{Mc}或者\\p{Spacing_Combining_Mark}:要与另一个占用额外空间的字符组合的字符(许多东方语言中的元音符号)。
    • \n
    • \\p{Me}或者\\p{Enclosing_Mark}:包含字符的字符与(圆形、方形、键帽等)组合。
    • \n
  • \n
  • \\p{Z}或者\\p{Separator}: 任何类型的空格或不可见的分隔符。\n \n
      \n
    • \\p{Zs}或者\\p{Space_Separator}:不可见但占用空间的空白字符。
    • \n
    • \\p{Zl}或者\\p{Line_Separator}:行分隔符 U+2028。
    • \n
    • \\p{Zp}或者\\p{Paragraph_Separator}:段落分隔符 U+2029。
    • \n
  • \n
  • \\p{S}或者\\p{Symbol}:数学符号、货币符号、装饰符号、方框图字符等\n \n
      \n
    • \\p{Sm}或者\\p{Math_Symbol}:任何数学符号。
    • \n
    • \\p{Sc}或者\\p{Currency_Symbol}:任何货币符号。
    • \n
    • \\p{Sk}或者\\p{Modifier_Symbol}:组合字符(标记)作为其自身的完整字符。
    • \n
    • \\p{So}或者\\p{Other_Symbol}:不是数学符号、货币符号或组合字符的各种符号。
    • \n
  • \n
  • \\p{N}\\p{Number}: 任何脚本中的任何类型的数字字符。\n \n
      \n
    • \\p{Nd}\\p{Decimal_Digit_Number}:除表意文字之外的任何文字中的数字 0 到 9。
    • \n
    • \\p{Nl}\\p{Letter_Number}:看起来像字母的数字,例如罗马数字。
    • \n
    • \\p{No}\\p{Other_Number}:上标或下标数字,或非数字 0\xe2\x80\x939 的数字(不包括来自表意文字的数字)。
    • \n
  • \n
  • \\p{P}\\p{Punctuation}: 任何类型的标点字符。\n \n
      \n
    • \\p{Pd}\\p{Dash_Punctuation}:任何类型的连字符或破折号。
    • \n
    • \\p{Ps}\\p{Open_Punctuation}:任何类型的左括号。
    • \n
    • \\p{Pe}\\p{Close_Punctuation}:任何类型的右括号。
    • \n
    • \\p{Pi}\\p{Initial_Punctuation}:任何类型的开场白。
    • \n
    • \\p{Pf}\\p{Final_Punctuation}:任何类型的结束报价。
    • \n
    • \\p{Pc}\\p{Connector_Punctuation}:标点符号,例如连接单词的下划线。
    • \n
    • \\p{Po}\\p{Other_Punctuation}:除破折号、括号、引号或连接符之外的任何类型的标点字符。
    • \n
  • \n
  • \\p{C}\\p{Other}: 不可见的控制字符和未使用的代码点。\n \n
      \n
    • \\p{Cc}\\p{Control}:ASCII 或 Latin-1 控制字符:0x00\xe2\x80\x930x1F 和 0x7F\xe2\x80\x930x9F。
    • \n
    • \\p{Cf}\\p{Format}:不可见的格式指示器。
    • \n
    • \\p{Co}\\p{Private_Use}:保留供私人使用的任何代码点。
    • \n
    • \\p{Cs}or \\p{Surrogate}:UTF-16 编码中代理对的一半。
    • \n
    • \\p{Cn}\\p{Unassigned}:未分配字符的任何代码点。
    • \n
  • \n
\n
\n

  • 上述正则表达式验证任何单词,即使不是域:https://regex101.com/r/ke0WXc/2 (2认同)