重音字符的具体Javascript正则表达式(变音符号)

2020/10/23 10:42 · javascript ·  · 0评论

我已经研究了Stack Overflow(替换字符.. ehJavaScript如何不遵循有关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]+$/
  • 它与一系列unicode字符匹配-经过测试和正常工作,尽管我没有做任何疯狂的事情,只是我在语言部门中看到的用于教师姓名的普通内容。

这是我的担忧:

  1. 第一个解决方案太过局限了,草率而又令人费解。如果我忘记了一个或两个字符,则需要更改它,但这不是很实际。
  2. 第二种解决方案更好,更简洁,但它可能比实际需要的匹配得多。我找不到任何实际的文件究竟是什么.比赛,(在从表中“任何除换行符字符”的只是概括MDN)。
  3. 第三种解决方案似乎是最精确的,但是有什么陷阱吗?我不是很熟悉的Unicode,在实践中至少,但看着码表/该表的延续\u00C0-\u017F似乎是非常稳固,至少在我的预期输入。

    • 教师不会以其母语(例如阿拉伯文,中文,日文等)提交带有其名称的表格,因此我不必担心拉丁字符集字符过多

因此,真正的问题是:这三种方法中哪一种最适合该任务?还是有更好的解决方案?

接受所有重音的更简单方法是:

[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/cn/

拉丁字母的重音范围\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 Supplement的一部分该范围将跳过无法打印的控制信号和除笨拙放置的乘除x\u00D7和除÷之外的所有符号\u00F7

[a-zA-Z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u024F] // exclude ×÷

如果需要更多代码点,可以在Wikipedia的Unicode字符列表中找到更多范围例如,您还可以添加Latin Extended-CDE,但是我将它们省略了,因为现在只有历史学家似乎对它们感兴趣,并且D和E集甚至在我的浏览器中无法正确呈现。

最初的正则表达式停靠在\u017F名称“ Șenol”上。根据FontSpace的Unicode分析器,第一个字符为\u0218拉丁字母大写字母S,下面是逗号。(是的,它通常拼写为cedilla-S \u015E,“Şenol”。但是我不是要飞往土耳其告诉他,“您的名字拼写错误!”)

这三种方法中哪一种最适合该任务?

取决于任务:-)要完全匹配所有拉丁字符及其带重音的版本,Unicode范围可能提供最佳解决方案。它们可以扩展到所有非空白字符,可以使用\S字符类来完成

我在UI中强制字段匹配以下格式:(last_name, first_name最后一个[逗号空间]首先)

我在这里看到的最基本的问题不是变音符号,而是空格。有一些名称由多个单词组成,例如标题。因此,您应该使用最通用的名称,即允许使用除以逗号区分姓氏和名字之外的所有内容:

/[^,]+,\s[^,]+/

但是,使用.字符类的第二种解决方案也一样,那么您只需要关心多个逗号即可。

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À-ÖØ-öø-ÿ]+$/

那这个呢?

^([a-zA-Z]|[à-ú]|[À-Ú])+$

它将匹配每个带有重音符号的单词。

来自此Wiki:https : //zh.wikipedia.org/wiki/List_of_Unicode_characters#Basic_Latin

对于拉丁字母,我用

/^[A-zÀ-ÖØ-öø-ÿ]+$/ 

它避免连字符和特殊字符

/^[\pL\pM\p{Zs}.-]+$/u

说明:

  • \pL -匹配任何语言的任何字母
  • \pM -附加一个打算与另一个字符组合的字符(例如重音符号,变音符,封闭框等)
  • \p{Zs} -匹配不可见但占用空间的空白字符
  • u -模式和主题字符串被视为UTF-8

与其他拟议的正则表达式(例如[A-Za-zÀ-ÖØ-öø-ÿ])不同,这将适用于所有特定于语言的字符,例如Šš,此规则匹配,但此页面上的其他字符则不匹配。

不幸的是,JavaScript本身不支持这些类。但是,您可以使用xregexp,例如

const XRegExp = require('xregexp');

const isInputRealHumanName = (input: string): boolean => {
  return XRegExp('^[\\pL\\pM-]+ [\\pL\\pM-]+$', 'u').test(input);
};

您可以使用以下方法从字母中删除变音符号:

var str = "résumé"
str.normalize('NFD').replace(/[\u0300-\u036f]/g, '') // returns resume

它将删除所有变音符,然后对其执行正则表达式

参考:

https://thread.engineering/2018-08-29-searching-and-sorting-text-with-diacritical-marks-in-javascript/

本文地址:http://javascript.askforanswer.com/zhongyinzifudejutijavascriptzhengzebiaodashibianyinfuhao.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!