【问题标题】:Regex allow only Uppercase Extended ASCII正则表达式只允许大写扩展 ASCII
【发布时间】:2021-12-30 22:26:03
【问题描述】:

我需要一个正则表达式来只允许我之前设置的 ma​​xLength 的大写扩展 ASCII 字符,它是单词的最大长度。

大写字母的正则表达式:\P{Ll}*

扩展 ASCII 字母的正则表达式:[\x00-\xFF]*

使用 ^[\p{Ll}] 还不够,因为我需要扩展 ASCII 字符(不允许表情符号或其他特殊字符超出 ASCII 扩展范围)。

如何结合这两个要求?以及 ma​​xLength 的长度。

谢谢!!

【问题讨论】:

  • 也许^[\p{Latin}&&\p{Lu}]{1,10}$ / ^(?:(?=\p{Lu})\p{Latin}){1,10}$ 会起作用?像所有大写字母的拉丁字母一样,出现一到十次?
  • @WiktorStribiżew 后者似乎有效,前者无效(&& 只是被解析为文字,而不是布尔运算符);我让它与双重否定字符类一起工作。

标签: regex


【解决方案1】:

一般情况下可以使用

^(?:(?=\p{Lu})\p{Latin}){1,10}$

请参阅regex demo详情

  • ^ - 字符串开头
  • (?: - 非捕获组的开始:
    • (?=\p{Lu})\p{Latin} - 来自 Latin Unicode 类别类的一个字符,它是一个大写字母
  • ){1,10} - 组结束,重复一到十次
  • $ - 字符串结束。

由于您在 DevExpress 屏蔽输入组件中使用正则表达式,因此您需要在字符类中枚举所有这些字母。基于Regex Latin characters filter and non latin character filer,你需要

Latin-1 补充 U+0080 - U+00FF
拉丁语扩展-A U+0100 - U+017F
拉丁语扩展-B U+0180 - U+024F

这三个范围内的所有大写字符都是您要允许的字符:

var res = []
for (var i=128; i<=591; i++) {                     // Get chars from \u0080 to \u024F
   if (/^\p{Lu}$/u.test(String.fromCharCode(i))) { // If it is an uppercase letter
     res.push(String.fromCharCode(i));             // Add it to the results
   } 
}
console.log(res.join(""))

代码如下所示

settings.MaskExpression = "[\\u00C0-\\u00D6\\u00D8-\\u00DE\\u0100\\u0102\\u0104\\u0106\\u0108\\u010A\\u010C\\u010E\\u0110\\u0112\\u0114\\u0116\\u0118\\u011A\\u011C\\u011E\\u0120\\u0122\\u0124\\u0126\\u0128\\u012A\\u012C\\u012E\\u0130\\u0132\\u0134\\u0136\\u0139\\u013B\\u013D\\u013F\\u0141\\u0143\\u0145\\u0147\\u014A\\u014C\\u014E\\u0150\\u0152\\u0154\\u0156\\u0158\\u015A\\u015C\\u015E\\u0160\\u0162\\u0164\\u0166\\u0168\\u016A\\u016C\\u016E\\u0170\\u0172\\u0174\\u0176\\u0178\\u0179\\u017B\\u017D\\u0181\\u0182\\u0184\\u0186\\u0187\\u0189-\\u018B\\u018E-\\u0191\\u0193\\u0194\\u0196-\\u0198\\u019C\\u019D\\u019F\\u01A0\\u01A2\\u01A4\\u01A6\\u01A7\\u01A9\\u01AC\\u01AE\\u01AF\\u01B1-\\u01B3\\u01B5\\u01B7\\u01B8\\u01BC\\u01C4\\u01C7\\u01CA\\u01CD\\u01CF\\u01D1\\u01D3\\u01D5\\u01D7\\u01D9\\u01DB\\u01DE\\u01E0\\u01E2\\u01E4\\u01E6\\u01E8\\u01EA\\u01EC\\u01EE\\u01F1\\u01F4\\u01F6-\\u01F8\\u01FA\\u01FC\\u01FE\\u0200\\u0202\\u0204\\u0206\\u0208\\u020A\\u020C\\u020E\\u0210\\u0212\\u0214\\u0216\\u0218\\u021A\\u021C\\u021E\\u0220\\u0222\\u0224\\u0226\\u0228\\u022A\\u022C\\u022E\\u0230\\u0232\\u023A\\u023B\\u023D\\u023E\\u0241\\u0243-\\u0246\\u0248\\u024A\\u024C\\u024E]{1,10}";

\u... 部分匹配ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞĀĂĄĆĈĊČĎĐĒĔĖĘĚĜĞĠĢĤĦĨĪĬĮİIJĴĶĹĻĽĿŁŃŅŇŊŌŎŐŒŔŖŘŚŜŞŠŢŤŦŨŪŬŮŰŲŴŶŸŹŻŽƁƂƄƆƇƉƊƋƎƏƐƑƓƔƖƗƘƜƝƟƠƢƤƦƧƩƬƮƯƱƲƳƵƷƸƼDŽLJNJǍǏǑǓǕǗǙǛǞǠǢǤǦǨǪǬǮDZǴǶǷǸǺǼǾȀȂȄȆȈȊȌȎȐȒȔȖȘȚȜȞȠȢȤȦȨȪȬȮȰȲȺȻȽȾɁɃɄɅɆɈɊɌɎ 集中的任何字母。

{1,10} 限制量词匹配一到十次出现。您可以进一步调整。

【讨论】:

  • 非常感谢您的回答。我只是想知道是否没有办法使 settings.MaskExpression 中的表达式更短或更简单?并使用扩展 ASCII 而不是 unicode...
  • @bags 不,因为您使用的正则表达式风格太有限了。
【解决方案2】:

对@Wiktor 的评论稍作修改,我认为更容易阅读:

^[^\P{Lu}\P{Latin}]{0,10}$

应匹配最多包含 10 个大写拉丁(包括扩展)字符的字符串。使用否定类查找 10 个不是 not 大写或 not 拉丁文的字符。它确实匹配像ĦꜴꝎꞂꜨⱠƎƢƔ 这样漂亮且绝对不会被诅咒的字符串。

【讨论】:

  • 但是如何在我的代码中使用它呢?它说我有语法错误,我试过这个: settings.MaskExpression = "^[^\\P{Lu}\\P{Latin}]{0,10}$";仍然有语法错误
  • @bags 您使用的是什么语言或应用程序?该语言可能使用无法识别 \P{Latin} 标记的正则表达式引擎。如果不是这样,我不知道该告诉您什么,因为您实际上没有显示任何会显示语法错误的代码。我确实知道这个正则表达式模式应该适用于 JS、Python 或任何使用 PCRE 的东西。
猜你喜欢
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-10
  • 2020-01-13
  • 1970-01-01
相关资源
最近更新 更多