测试字符串是否只包含字母(az +éüöêåø等...)

pat*_*tad 30 javascript regex diacritics

我想匹配一个字符串,以确保它只包含字母.

我有这个,它工作得很好:

var onlyLetters = /^[a-zA-Z]*$/.test(myString);
Run Code Online (Sandbox Code Playgroud)

由于我也说另一种语言,我需要允许所有字母,而不仅仅是AZ.还有例如:

é ü ö ê å ø
Run Code Online (Sandbox Code Playgroud)

有没有人知道是否有一个全球'alpha'术语,包括与regExp一起使用的所有字母?或者甚至更好,有没有人有某种解决方案?

非常感谢

编辑: 刚才意识到你可能也想允许' - '和''加上一个双重名字,如:'Mary-Ann'或'Mary Ann'

Deb*_*ski 32

我不知道这样做的实际原因,但是如果你想用它作为用户昵称的登录名的预检,我建议你自己输入字符而不要使用整个您将在unicode中找到'alpha'字符,因为您可能无法在以下字母中找到光学差异:

? ? A ? ?  # cyrillic, latin, greek
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果您想最大限度地减少帐户伪造等,最好手动指定允许的字母.

加成

好吧,如果它是一个应该是非独特的领域,我也会允许希腊语.当我强迫用户将他们的名字改为拉丁版本时,我感觉不舒服.

但是对于像昵称这样的独特字段,你需要给网站的其他访问者一个提示,这真的是他们认为的昵称.很糟糕,人们会伪造帐户,我已经和我交换了.当然,这取决于您的用户; 但我相信我认为最好只允许基本的拉丁语+变音符号.(也许看一下这个列表:Latin-derived_alphabet)

作为未经测试的建议(带' - ','_'和''):

/^[a-zA-Z\-_ ’'‘ÆÐ??????Œ?Þ??æð??????œ??ßþ????Ç???????Ø????????Y????ç???????ø????????y??ÁÀÂÄ???ÃÅ??Æ???????Ç????ÐÉÈ?ÊË??????????????áàâä???ãå??æ???????ç????ðéè?êë?????????????????IÍÌ?ÎÏ????????????????N?N??Ñ??ÓÒÔÖ???Õ??Ø??Œ????íìiîï??????????????????n??ñ??óòôö???õ??ø??œ?????Š????????ÞÚÙÛÜ??????????????Ý??Ÿ?????Ž???????š???ß????þúùûü??????????????ý??ÿ?????ž?]$/.test(myString)
Run Code Online (Sandbox Code Playgroud)

另一个编辑: 我为奥尼尔或奥莱利这样的人添加了撇号.(对于那些无法正确进入卷曲状态的人来说,直的和反向的撇号.)

  • 我确信可以通过使用字符范围来稍微改进正则表达式。像这样的东西:“[A-Za-zÀ-ÿ]”会捕获所有 ASCII 字母。检查 http://en.wikipedia.org/wiki/List_of_Unicode_characters 以获得完整列表。 (2认同)

小智 15

var onlyLetters = /^[a-zA-Z\u00C0-\u00ff]+$/.test(myString)
Run Code Online (Sandbox Code Playgroud)


Bal*_*usC 11

你不能在JS中这样做.它具有非常有限的正则表达式和规范化器支持.您需要构建一个冗长且不可维护的字符数组,其中所有可能的拉丁字符都带有变音符号(我猜有大约500个不同的字符).而是将验证任务委托给使用具有更多正则表达能力的另一种语言的服务器端,如果需要,可以借助ajax.

在完全成熟的正则表达式环境中,您可以测试字符串是否匹配\p{L}+.这是一个Java示例:

boolean valid = string.matches("\\p{L}+");
Run Code Online (Sandbox Code Playgroud)

或者,您也可以对文本进行normailze以消除变音符号并检查它是否[A-Za-z]+仅包含变量.这又是一个Java示例:

string = Normalizer.normalize(string, Form.NFD).replaceAll("\\p{InCombiningDiacriticalMarks}+", "");
boolean valid = string.matches("[A-Za-z]+");
Run Code Online (Sandbox Code Playgroud)

PHP支持类似的功能.


Ben*_*n Y 9

当我试图实现@ Debilski的解决方案时,JavaScript不喜欢扩展的拉丁字符 - 我必须将它们编码为JavaScript转义:

// The huge unicode escape string is equal to ÆÐ??????Œ?Þ??æð??????œ??ßþ????Ç????
// ???Ø????????Y????ç???????ø????????y??ÁÀÂÄ???ÃÅ??Æ???????Ç????ÐÉÈ?ÊË??????
// ????????áàâä???ãå??æ???????ç????ðéè?êë?????????????????IÍÌ?ÎÏ??????
// ??????????N?N??Ñ??ÓÒÔÖ???Õ??Ø??Œ????íìiîï??????????????????n??ñ
// ??óòôö???õ??ø??œ?????Š????????ÞÚÙÛÜ??????????????Ý??Ÿ?????Ž???????š???ß???
// ?þúùûü??????????????ý??ÿ?????ž?

function isAlpha(string) {
    var patt = /^[a-zA-Z\u00C6\u00D0\u018E\u018F\u0190\u0194\u0132\u014A\u0152\u1E9E\u00DE\u01F7\u021C\u00E6\u00F0\u01DD\u0259\u025B\u0263\u0133\u014B\u0153\u0138\u017F\u00DF\u00FE\u01BF\u021D\u0104\u0181\u00C7\u0110\u018A\u0118\u0126\u012E\u0198\u0141\u00D8\u01A0\u015E\u0218\u0162\u021A\u0166\u0172\u01AFY\u0328\u01B3\u0105\u0253\u00E7\u0111\u0257\u0119\u0127\u012F\u0199\u0142\u00F8\u01A1\u015F\u0219\u0163\u021B\u0167\u0173\u01B0y\u0328\u01B4\u00C1\u00C0\u00C2\u00C4\u01CD\u0102\u0100\u00C3\u00C5\u01FA\u0104\u00C6\u01FC\u01E2\u0181\u0106\u010A\u0108\u010C\u00C7\u010E\u1E0C\u0110\u018A\u00D0\u00C9\u00C8\u0116\u00CA\u00CB\u011A\u0114\u0112\u0118\u1EB8\u018E\u018F\u0190\u0120\u011C\u01E6\u011E\u0122\u0194\u00E1\u00E0\u00E2\u00E4\u01CE\u0103\u0101\u00E3\u00E5\u01FB\u0105\u00E6\u01FD\u01E3\u0253\u0107\u010B\u0109\u010D\u00E7\u010F\u1E0D\u0111\u0257\u00F0\u00E9\u00E8\u0117\u00EA\u00EB\u011B\u0115\u0113\u0119\u1EB9\u01DD\u0259\u025B\u0121\u011D\u01E7\u011F\u0123\u0263\u0124\u1E24\u0126I\u00CD\u00CC\u0130\u00CE\u00CF\u01CF\u012C\u012A\u0128\u012E\u1ECA\u0132\u0134\u0136\u0198\u0139\u013B\u0141\u013D\u013F\u02BCN\u0143N\u0308\u0147\u00D1\u0145\u014A\u00D3\u00D2\u00D4\u00D6\u01D1\u014E\u014C\u00D5\u0150\u1ECC\u00D8\u01FE\u01A0\u0152\u0125\u1E25\u0127\u0131\u00ED\u00ECi\u00EE\u00EF\u01D0\u012D\u012B\u0129\u012F\u1ECB\u0133\u0135\u0137\u0199\u0138\u013A\u013C\u0142\u013E\u0140\u0149\u0144n\u0308\u0148\u00F1\u0146\u014B\u00F3\u00F2\u00F4\u00F6\u01D2\u014F\u014D\u00F5\u0151\u1ECD\u00F8\u01FF\u01A1\u0153\u0154\u0158\u0156\u015A\u015C\u0160\u015E\u0218\u1E62\u1E9E\u0164\u0162\u1E6C\u0166\u00DE\u00DA\u00D9\u00DB\u00DC\u01D3\u016C\u016A\u0168\u0170\u016E\u0172\u1EE4\u01AF\u1E82\u1E80\u0174\u1E84\u01F7\u00DD\u1EF2\u0176\u0178\u0232\u1EF8\u01B3\u0179\u017B\u017D\u1E92\u0155\u0159\u0157\u017F\u015B\u015D\u0161\u015F\u0219\u1E63\u00DF\u0165\u0163\u1E6D\u0167\u00FE\u00FA\u00F9\u00FB\u00FC\u01D4\u016D\u016B\u0169\u0171\u016F\u0173\u1EE5\u01B0\u1E83\u1E81\u0175\u1E85\u01BF\u00FD\u1EF3\u0177\u00FF\u0233\u1EF9\u01B4\u017A\u017C\u017E\u1E93]+$/;
    return patt.test(string);
}
Run Code Online (Sandbox Code Playgroud)


aDe*_*Dev 8

这可能很棘手,遗憾的是JavaScript对国际化的支持很差.为此,请检查您是否必须创建自己的角色类.这是因为,例如,\w它是相同的,[0-9A-Z_a-z]它不会帮助你太多,并没有像[[:alpha:]]Javascript中的任何东西.但是,因为听起来你只想使用另一个语言,你可以将其他字符添加到你的角色类中.

顺便说一下,如果myString可以超过一个字符,我认为你需要一个?*在你的regexp中.

完整的例子,

/^[a-zA-Zéüöêåø]*$/.test(myString);


Dav*_*fer 7

应该有,但正则表达式将依赖于本地化.因此,é ü ö ê å ø例如,如果您使用的是美国本地化,则不会进行过滤.为了确保您的网站能够在所有本地化版本中执行您想要的操作,您应该以类似于您现在正在执行的形式明确地写出字符.

我知道的唯一标准是\w,它将匹配所有字母数字字符.您可以通过运行两个正则表达式来实现"标准"方式,一个用于验证\w匹配,另一个用于验证\d(所有数字)不匹配,这将导致保证仅限字母的字符串.同样,我强烈建议你不要使用这种技术,因为不能保证\w在给定的本地化中代表什么,但这确实回答了你的问题.


Vir*_*ras 6

我对Javascript一无所知,但如果它有正确的unicode支持,将你的字符串转换为分解形式,然后从中删除变音符号([\u0300-\u036f\u1dc0-\u1dff]).那么你的信件只会是ASCII信件.


Haz*_*ior 6

你可以使用黑名单而不是白名单.这样你只需要删除你不需要的字符.

  • 黑名单需要很长时间才能合理. (2认同)