当前位置: 首页 > 知识库问答 >
问题:

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

鲜于煜祺
2023-03-14

我看了Stack Overflow(替换字符...呃,JavaScript如何不遵循有关RegExp的Unicode标准等),但还没有真正找到“JavaScript如何匹配重音字符(带有变音符号的字符)”这个问题的具体答案?

我正在强制UI中的字段匹配html" target="_blank">格式: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.+$/;
  • 这几乎可以匹配任何东西,至少以以下形式:某物,某物。没关系,我想
/^[a-zA-Z\u00C0-\u017F]+,\s[a-zA-Z\u00C0-\u017F]+$/
  • 它匹配一系列Unicode字符-经过测试和工作,尽管我没有尝试任何疯狂的事情,只是我在我们的语言部门看到的教职员工姓名的正常东西。

以下是我的担忧:

>

  • 第一个解决方案太局限,太草率,太复杂。如果我忘记了一两个字符,就需要改变它,这不太实际。

    第二种解决方案更好、更简洁,但它可能比实际应该匹配的要多。我找不到任何关于确切内容的真正文档 匹配,只是“除换行符以外的任何字符”(来自MDN上的表)的泛化。

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

      null

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

  • 共有3个答案

    曾新
    2023-03-14

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

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

    我正在强制UI中的字段匹配格式last_name,first_name(last[逗号空格]first)

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

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

    但您的第二个解决方案是使用<代码> 字符类也很好,您可能只需要关心多个commata即可。

    乐宜民
    2023-03-14

    重音拉丁范围\u00C0-\u017F对于我的名称数据库来说还不够,所以我将正则表达式扩展为

    [a-zA-Z\u00C0-\u024F]
    [a-zA-Z\u00C0-\u024F\u1E00-\u1EFF] // includes even more Latin chars
    

    我添加了这些代码块(\u00C0-\u024F同时包括三个相邻的块):

    • \u00C0-\u00FF拉丁语-1补充
    • \u0100-\u017F拉丁语扩展-A
    • \u0180-\u024F拉丁语扩展-B
    • \u1E00-\u1EFF拉丁语扩展附加

    请注意,\u00C0-\u00FF实际上只是拉丁语-1补充的一部分。它跳过了不可打印的控制信号和所有符号,除了笨拙放置的乘×\u00D7和除法÷\u00F7

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

    如果您需要更多代码点,您可以在维基百科的Unicode字符列表中找到更多范围。例如,您还可以添加拉丁语Exted-C、D和E,但我忽略了它们,因为现在似乎只有历史学家对它们感兴趣,而D和E集甚至无法在我的浏览器中正确呈现。

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

    国高杰
    2023-03-14

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

    [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字符表。

     类似资料:
    • 我已经研究了堆栈溢出(替换字符...呃,JavaScript如何不遵循有关RegExp的Unicode标准等等),但还没有找到这个问题的具体答案: 目前,我正在讨论三种添加支持的方法中的一种,所有这些方法我都进行了测试和工作(至少在某种程度上,我不知道第二种方法的“范围”是什么)。它们在这里: 这将使姓/名与中支持的任何重音字符正确匹配。 这与任何东西都是匹配的,至少以的形式是这样的。好吧,我想.

    • 问题内容: 我已经研究了StackOverflow替换字符。eh,JavaScript如何不遵循有关RegExp的Unicode标准等),还没有真正找到问题的具体答案: 我正在强制UI中的字段匹配以下格式:( 最后一个[逗号空间]首先) ,并且我想提供对变音符号的支持,但是显然在JavaScript中,它比其他语言/平台要难一些。 这是我的原始版本,直到我想添加变音符号支持: 目前,我正在讨论增加

    • 问题内容: 我正在尝试查找带有重音符号的数据。我已经试过了: 而且有效。它查找XML数据字段包含where的所有记录。问题在于它仅将大写字母E与重音符匹配。我试图编写一个更通用的查询,以使用对等类查找带有重音元音(a,e,i,o,u,大写和小写以及任何重音)的所有数据。我想要一个正则表达式 仅 匹配重音元音,但是我不确定如何获取它,因为等价类(例如匹配 所有 e的(带或不带有重音))都可以。 另外

    • 问题内容: 如何从字符串中删除重音符号?尤其是在IE6中,我有类似以下内容: 但是IE6困扰着我,似乎不喜欢我的正则表达式。 问题答案: 使用ES2015 / ES6 String.Prototype.Normalize(), 这里发生两件事: 根据Unicode规范形式,将组合的字形分解为简单的字形。在中端起来表示为+ 。 现在,使用正则表达式字符类来匹配U + 0300→U + 036F范围,

    • 问题内容: 我有一个单词列表,我必须输出其中没有元音的单词数量。我到目前为止 我更担心reg表达式是错误的。 问题答案: 这对我有用: 另外,您应该小写字符串,而不是表达式:

    • 我试图为密码字段创建一个验证,它只允许字符和 时有什么区别,以及哪些字符来自