Chr*_*ice 129 javascript regex unicode
我看过Stack Overflow(替换字符......呃,JavaScript如何不遵循关于RegExp的Unicode标准等)并且没有真正找到问题的具体答案:
How can JavaScript match for accented characters (those with diacritical marks)?
我强迫UI中的字段匹配格式:( last_name, first_name 最后[逗号空间]),我想提供对变音符号的支持,但显然在JavaScript中它比其他语言/平台要困难一些.
这是我的原始版本,直到我想添加变音支持:
/^[a-zA-Z]+,\s[a-zA-Z]+$/
目前我正在讨论增加支持的三种方法之一,所有这些我都经过测试和工作(至少在某种程度上,我真的不知道第二种方法的"范围"是什么).他们来了:
var accentedCharacters = "àèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇߨøÅ寿œ";
// Build the full regex
var regex = "^[a-zA-Z" + accentedCharacters + "]+,\\s[a-zA-Z" + accentedCharacters + "]+$";
// Create a RegExp from the string version
regexCompiled = new RegExp(regex);
// regexCompiled = /^[a-zA-ZàèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇߨøÅ寿œ]+,\s[a-zA-ZàèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇߨøÅ寿œ]+$/
accentedCharacters..字符类,以获得更简单的表达式:var regex = /^.+,\s.+$/;
something, something.那我觉得好吧....../^[a-zA-Z\u00C0-\u017F]+,\s[a-zA-Z\u00C0-\u017F]+$/
以下是我的担忧:
.比赛,(在从表中"任何除换行符字符"的只是概括MDN).第三种解决方案似乎是最精确的,但有任何问题吗?我不是很熟悉Unicode,至少在实践中,但是查看该表的代码表/延续,\u00C0-\u017F似乎非常可靠,至少对于我的预期输入.
那么真正的问题:这三种方法中哪一种最适合这项任务?或者有更好的解决方案吗?
May*_*ura 205
接受所有重音的更简单方法是:
[A-zÀ-ú] // accepts lowercase and uppercase characters
[A-zÀ-ÿ] // as above but including letters with an umlaut (includes [ ] ^ \ × ÷)
[A-Za-zÀ-ÿ] // as above but not including [ ] ^ \
[A-Za-zÀ-ÖØ-öø-ÿ] // as above but not including [ ] ^ \ × ÷
有关按数字顺序列出的字符,请参阅https://unicode-table.com/en/.
Cha*_*ert 29
重音拉丁语范围\u00C0-\u017F对于我的名字数据库还不够,所以我将正则表达式扩展到了
[a-zA-Z\u00C0-\u024F]
[a-zA-Z\u00C0-\u024F\u1E00-\u1EFF] // includes even more Latin chars
我添加了这些代码块(\u00C0-\u024F包括三个相邻的块):
\u00C0-\u00FF Latin-1补充\u0100-\u017F 拉丁语扩展-A\u0180-\u024F Latin Extended-B\u1E00-\u1EFF 拉丁语扩展附加如果您需要更多代码点,可以在Wikipedia的Unicode字符列表中找到更多范围.例如,您还可以添加Latin Extended-C,D和E,但是我将它们排除在外,因为现在只有历史学家对它们感兴趣,而D和E集甚至在我的浏览器中都没有正确呈现.
最初的正则表达式停止在\u00C0-\u00FF名为"Şenol"的borked上.根据FontSpace的Unicode分析器,第一个字符是\u00D7LATIN CAPITAL LETTER S,下面是COMMA.(是的,它通常用cedilla-S拼写\u00F7,"Şenol."但我不是飞往土耳其去告诉他,"你拼错了你的名字!")
Ber*_*rgi 18
这三种方法中哪一种最适合这项任务?
取决于任务:-)为了完全匹配所有拉丁字符及其重音版本,Unicode范围可能提供最佳解决方案.它们可能会扩展到所有非空白字符,这可以使用\S字符类来完成.
我正在强制UI中的字段匹配格式:(
last_name, first_name最后[逗号空间]第一个)
我在这里看到的最基本的问题不是变音符号,而是空格.有几个名称由多个单词组成,例如标题.所以你应该选择最通用的,即允许除逗号之外的所有内容,首先区别于姓氏:
/[^,]+,\s[^,]+/
但是你的第二个解决方案与.角色类一样好,你可能只需要关心多个commata.
tho*_*rn̈ 14
该XRegExp库有一个名为Unicode的插件,可以帮助解决这样的任务.
<script src="xregexp.js"></script>
<script src="addons/unicode/unicode-base.js"></script>
<script>
  var unicodeWord = XRegExp("^\\p{L}+$");
  unicodeWord.test("???????"); // true
  unicodeWord.test("???"); // true
  unicodeWord.test("???????"); // true
</script>
这个问题的评论中提到过,但很容易错过.我提交这个答案之后才注意到它.
这个怎么样?
/^[a-zA-ZÀ-ÖØ-öø-ÿ]+$/
/^[\pL\pM\p{Zs}.-]+$/u
解释:
\pL - 匹配来自任何语言的任何类型的字母\pM - 匹配一个打算与另一个字符组合的字符(例如重音、变音、封闭框等)\p{Zs} - 匹配一个不可见但占用空间的空白字符u - 模式和主题字符串被视为 UTF-8与其他提议的正则表达式(例如[A-Za-zÀ-ÖØ-öø-ÿ])不同,这将适用于所有特定于语言的字符,例如Šš与此规则匹配,但与此页面上的其他字符不匹配。
不幸的是,JavaScript 本身并不支持这些类。但是,您可以使用xregexp,例如
/^[\pL\pM\p{Zs}.-]+$/u
那这个呢?
^([a-zA-Z]|[à-ú]|[À-Ú])+$
它将匹配每个带有重音符号的单词。
您可以使用以下方法从字母表中删除变音符号:
var str = "résumé"
str.normalize('NFD').replace(/[\u0300-\u036f]/g, '') // returns resume
它将删除所有变音符号,然后对其执行正则表达式
参考:
| 归档时间: | 
 | 
| 查看次数: | 86616 次 | 
| 最近记录: |