【问题标题】:Translating RegEx from PHP to Asp.Net RegularExpressionValidator将 RegEx 从 PHP 转换为 Asp.Net RegularExpressionValidator
【发布时间】:2016-10-14 16:13:03
【问题描述】:

我目前正在运行这个 RegularExpressionValidator:

<asp:RegularExpressionValidator ID="rev_Nachname" runat="server" ControlToValidate="edtNachname"
                            Display="None" ErrorMessage="$InvalidBeginOfStringNonTechnik$Nachname$2" ValidationExpression="^[a-zA-ZÆÄÜÖáâãäåæçèéêëìíîïñòóôõöøùúûüß0-9'-]{2}.*"></asp:RegularExpressionValidator>

我现在确实需要将其更改为 Unicode - 拉丁语并为 PHP 创建了以下 RegEx:

^[\p{Latin}+\p{M}*+0-9'-]{2,}

更改正则表达式并部署相关站点后 - 如果我打开更改正则表达式的站点,应用程序将超时 - 如果我撤消更改,一切正常。

因为我没有收到任何错误,所以我有点不知所措 - 但认为 ASP 无法处理我的 RegEx。 有什么明显的原因它不起作用吗?

提前致谢!

【问题讨论】:

  • 正则表达式是否仅在服务器端工作?您需要匹配哪些确切的 Unicode 范围和字符?您的 ^[\p{Latin}+\p{M}*+0-9'-]{2,} 正则表达式匹配两个或多个字符、拉丁文、加号、变音符号、星号、数字、撇号或连字符。
  • 我需要匹配这里列出的每个字母:xoev.de/latinchars/1_1/latinchars.pdf 以及 0-9,',- \p{M}*+ 取自这里:regular-expressions.info/unicode.html 部分: Unicode 类别 Regexvalidator 似乎不喜欢 \p{Latin}
  • 基本拉丁语的范围是多少?它只是所有可打印的ASCII吗?尝试 [ -~] 匹配任何 ASCII 字符。同样,正则表达式是在服务器还是客户端或两者上执行?关键是正则表达式引擎不支持\p*+
  • 正则表达式在服务器和客户端都经过验证。 Range 基本上是此处列出的可用 LatinScripts 的每个 .NET 子集:msdn.microsoft.com/en-us/library/… 但是这些范围内的任何非字母都需要限制 ASCII ASCII 之前已实现,我们现在需要匹配每个 LatinChar。

标签: php asp.net regex


【解决方案1】:

您似乎希望允许名称中包含 Latin 的所有 Unicode 类别。以下是它们的范围:

| Code point range  |        Block name            |
|--------------------------------------------------|
|   0000 - 007F     |    IsBasicLatin              |
|   0080 - 00FF     |    IsLatin-1Supplement       |
|   0100 - 017F     |    IsLatinExtended-A         | 
|   0180 - 024F     |    IsLatinExtended-B         |
|   1E00 - 1EFF     |    IsLatinExtendedAdditional |
|--------------------------------------------------|

因此,您可以从它们创建一个自定义特殊类并将'0-9- 添加到其中以获得您之前正则表达式的扩展版本:[\u0000-\u007F\u0080-\u00FF\u0100-\u017F\u0180-024F\u1E00-\u1EFF'0-9-]

但是,您当前的正则表达式仅匹配字符串 ^ 的开头、自定义字符类中的 2 个字符([...]{2} 部分),然后是除换行符之外的任何 0+ 字符 (.*)。扩展版本看起来像

^[\u0000-\u007F\u0080-\u00FF\u0100-\u017F\u0180-024F\u1E00-\u1EFF'0-9-]{2}.*    

如果您需要允许自定义字符类中的两个或更多符号,请使用

^[\u0000-\u007F\u0080-\u00FF\u0100-\u017F\u0180-024F\u1E00-\u1EFF'0-9-]{2,}$

更新

因此,您需要支持 BMP 平面之外的变音符号,以及不包括其中一些的特定 Unicode 代码点范围。

^(?:(?:(?:(?![\u0009-\u002F\u003A-\u0040])[a-zA-Z\u006E-\u0302\u006D-\u0302\u004A-\u030C'0-9-])|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])){2,}

这是regex demo

模式的主要部分是(?:(?![\u0009-\u002F\u003A-\u0040])[a-zA-Z\u006E-\u0302\u006D-\u0302\u004A-\u030C'0-9-]),其余部分用于匹配变音符号。

【讨论】:

  • 他们将能够在该正则表达式中使用像 € 之类的符号 - 我想否认这一点,这就是为什么我不想使用您发布的带有范围的正则表达式!有没有办法在不排除这些范围内可用的每个 NonLetter 的情况下防止这种情况发生?具有两个 CodePoints 的字符会匹配吗?例如。 0044+0302
  • 在 JS 中,您无法在 ES5 中轻松匹配 BMP 平面之外的代码点。在 ES6 中,这更容易,但不确定浏览器是否支持。请注意,您实际上并没有说明您需要什么字母,但我怀疑您想要(?![×÷])[A-Za-zÀ-ÿ]。见stackoverflow.com/a/30798598/3832970。最好能提供一些有效和无效的输入供我测试。
  • 这些不应匹配:0009-002F 003A-0040 这些应匹配:006E+0302 006D+0302 004A+030C
  • D̂ (0044+0302) 不会被匹配。所以我需要手动添加这些?那会很烦人。
猜你喜欢
  • 2016-10-25
  • 1970-01-01
  • 1970-01-01
  • 2019-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-31
  • 2021-09-04
相关资源
最近更新 更多