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

我查看了Stack Overflow (替换字符. .嗯JavaScript如何不遵循关于RegExp的Unicode标准等),并没有真正找到问题“__abc2”的具体答案。

我强迫UI中的一个字段匹配格式:last_name, first_name (最后[逗号空格]第一个),我想提供对变音符的支持,但显然在JavaScript中比其他语言/平台更难一点。

这是我最初的版本,直到我想添加变音符支持:

/^[a-zA-Z]+,\s[a-zA-Z]+$/

目前,我正在讨论添加支持的三种方法中的一种,所有这些方法我都已经测试过并且有效(至少在某种程度上,我真的不知道"程度;quot;属于第二种方法)。他们是:

显式列出我想接受为有效的所有重音字符(蹩脚和过于复杂):


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. 第二个解决方案更好,简洁,但它可能比实际应该匹配的要多得多。我在完全上找不到任何.匹配的真实文档,只是概括了“除换行符外的任何字符”。(来自中数上的一个表)。

  3. 第三个解决方案似乎是最精确的,但有什么问题吗?我对Unicode不是很熟悉,至少在实践中是这样,但看看代码表/这张表的延续\u00C0-\u017F似乎是相当可靠的,至少对我预期的输入是这样。

  • 老师们提交的表格不会用他们的母语(如阿拉伯语、中文、日语等)写他们的名字,所以我不必担心不符合拉丁字符集的字符

这三种方法中哪一种最适合这项任务?或者有没有更好的解决方案?

183790 次浏览

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

要精确匹配所有拉丁字符及其重音版本,Unicode范围可能提供了最佳解决方案。它们可以扩展到所有非空白字符,这可以使用\S字符类来完成。

我强制在UI中的字段匹配格式:last_name, first_name(最后[逗号空格]第一个)

我在这里看到的最基本的问题不是变音符,而是空格。有一些名称由多个单词组成,例如标题。所以你应该使用最通用的,那就是允许所有的东西,但逗号区分姓和名:

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

但是你使用.字符类的第二个解决方案也一样好,你可能只需要关心多个逗号。

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

[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 [ ] ^ \ × ÷

请参阅Unicode Character Table以数字顺序列出的字符。

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>

重读的拉丁范围\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补充的一部分。它跳过不可打印的控制信号和所有符号,除了放置在尴尬位置的乘法× \u00D7和除法÷ \u00F7

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

如果你需要更多的代码点,你可以在维基百科的Unicode字符列表上找到更多的范围。例如,你也可以添加拉丁Extended-CDE,但我省略了它们,因为现在似乎只有历史学家对它们感兴趣,而且D和E集甚至不能在我的浏览器中正确呈现。

原来的正则表达式停止在\u017F上的名称"Șenol"。根据FontSpace的Unicode分析器,第一个字符是\u0218,拉丁大写字母S,下面有逗号。(是的,它通常拼写为cedilla-S \u015E, "Şenol."但我不会飞到土耳其去告诉他:“你的名字拼错了!”

来自维基百科:基本拉丁语 .

对于拉丁字母,我使用

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

它避免了连字符和特殊字符。

你可以用这个:

/^[a-zA-ZÀ-ÖØ-öø-ÿ]+$/

你可以用这个:

^([a-zA-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

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

参考:

< a href = " https://thread。engineering/2018-08-29 Searching -and-sort -text-with-变音符标记-in- JavaScript /" rel="nofollow noreferrer">在JavaScript中搜索和排序带有变音符标记的文本 . js /" rel="nofollow noreferrer

我的上下文略有不同,仅限于法语:我想通过允许出现口音错误来搜索文本。

例如,我想查找&;ma__abc1tris__abc2 &;,但要搜索的文本是"…maitrisee…“。因此,我在JavaScript中使用正则表达式/ma[i|î|ï]tris[e|é|è|ê|ë]/

在表达式中,'['和']'定义了一组字符,'|'是一个OR条件。

本页给出了一个重音字符列表:Diacritiques utilisés en français