我希望我的域名不包含超过一个连续的(.)或\'/\'任何其他特殊字符。但它可以包含 IDN 字符,例如\xc3\x81, \xc5\x9b, etc... 我可以使用此正则表达式来满足所有要求(IDN 除外):
@"^(?:[a-zA-Z0-9][a-zA-Z0-9-_]*\\.)+[a-zA-Z0-9]{2,}$";\nRun Code Online (Sandbox Code Playgroud)\n\n问题是这个正则表达式也拒绝 IDN 字符。我想要一个允许 IDN 字符的正则表达式。我做了很多研究,但我无法弄清楚。
\nRegex 包含一个字符类,允许您指定 Unicode 常规类别\\p{}。MSDN正则表达式文档包含以下内容:
\n\n\n\n
\\p{ name }匹配 Unicode 常规类别或由名称指定的命名块中的任何单个字符。
另外,作为旁注,我注意到你的正则表达式包含一个未转义的.. 在正则表达式中,点字符.具有任何字符的特殊含义(换行符除外,除非另有说明)。您可能需要将其更改为\\.以确保功能正常。
编辑现有代码以包含 Unicode 字符类而不仅仅是 ASCII 字母,您应该获得以下效果:
\n\n^(?:[\\p{L}\\p{N}][\\p{L}\\p{N}-_]*.)+[\\p{L}\\p{N}]{2,}$\nRun Code Online (Sandbox Code Playgroud)\n\n\\p{L}表示任何语言/脚本中任何字母的 Unicode 字符类\\p{N}代表任何语言/脚本中任何数字的 Unicode 字符类(根据您的字符示例,您可能可以保留0-9,但我想我会向您展示一般概念并为您提供一些额外的信息)该站点提供了最常用的 Unicode 类别的快速总体概述。
\n\n\n\n\n
\n- \n
\\p{L}或\\p{Letter}: 来自任何语言的任何类型的字母。\n \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
\\p{M}或\\p{Mark}:要与另一个字符组合的字符(例如重音符号、变音符号、封闭框等)。\n \n\n
- \n
\\p{Mn}或者\\p{Non_Spacing_Mark}:用于与另一个字符组合而不占用额外空间的字符(例如\n 重音符号、变音符号等)。- \n
\\p{Mc}或者\\p{Spacing_Combining_Mark}:要与另一个占用额外空间的字符组合的字符(许多东方语言中的元音符号)。- \n
\\p{Me}或者\\p{Enclosing_Mark}:包含字符的字符与(圆形、方形、键帽等)组合。- \n
\\p{Z}或者\\p{Separator}: 任何类型的空格或不可见的分隔符。\n \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
\\p{S}或者\\p{Symbol}:数学符号、货币符号、装饰符号、方框图字符等\n \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
\\p{N}或\\p{Number}: 任何脚本中的任何类型的数字字符。\n \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
\\p{P}或\\p{Punctuation}: 任何类型的标点字符。\n \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
\\p{C}或\\p{Other}: 不可见的控制字符和未使用的代码点。\n \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}:未分配字符的任何代码点。