Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
重音字符(变音符号)的具体Javascript正则表达式_Javascript_Regex_Unicode - Fatal编程技术网

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

重音字符(变音符号)的具体Javascript正则表达式,javascript,regex,unicode,Javascript,Regex,Unicode,我已经研究了堆栈溢出(,等等),但还没有找到这个问题的具体答案: JavaScript如何匹配重音字符(带有变音符号的字符)? 我正在强制UI中的一个字段匹配格式:last\u name,first\u name(last[comma space]first),我想提供对变音符号的支持,但显然在JavaScript中,它比其他语言/平台更难 这是我的原始版本,直到我想添加变音符号支持: /^[a-zA-Z]+,\s[a-zA-Z]+$/ 目前,我正在讨论添加支持的三种方法之一,所有这些方法我都已

我已经研究了堆栈溢出(,等等),但还没有找到这个问题的具体答案:

JavaScript如何匹配重音字符(带有变音符号的字符)?

我正在强制UI中的一个字段匹配格式:
last\u name,first\u name
(last[comma space]first),我想提供对变音符号的支持,但显然在JavaScript中,它比其他语言/平台更难

这是我的原始版本,直到我想添加变音符号支持:

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

目前,我正在讨论添加支持的三种方法之一,所有这些方法我都已经测试过并工作过(至少在某种程度上,我真的不知道第二种方法的“范围”是什么)。这是:

明确列出我希望接受为有效的所有重音字符(蹩脚且过于复杂):
  • 这会将姓氏/名与
    重音字符中支持的任何重音字符正确匹配

我的另一种方法是使用
字符类,以获得更简单的表达式:
  • 这几乎可以匹配任何东西,至少以:
    something,something
    的形式。没关系,我想

最后一种方法,我可能更简单。。。
  • 它匹配了一系列unicode字符——经过测试并正常工作,尽管我没有做任何疯狂的尝试,只是我在语言系看到的关于教员姓名的普通东西

以下是我关注的问题:

  • 第一个解决方案太过局限,而且在这方面过于草率和复杂。如果我忘了一两个字符,它就需要更改,这不太实际
  • 第二种解决方案更好、更简洁,但它可能比实际应该匹配的要多。我找不到任何关于
    匹配内容的真实文档,只找到了“除换行符以外的任何字符”的泛化(来自上表)
  • 第三种解决方案似乎是最精确的,但有什么问题吗?我对Unicode不是很熟悉,至少在实践中是这样,但看看a/,
    \u00C0-\u017F
    似乎非常可靠,至少对于我预期的输入来说是这样

    • 教员不会提交以母语(如阿拉伯语、汉语、日语等)填写姓名的表格,因此我不必担心拉丁字符集以外的字符

  • 那么真正的问题是:这三种方法中哪一种最适合这项任务?还是有更好的解决方案

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

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

    我正在强制UI中的一个字段匹配以下格式:
    last\u name,first\u name
    (last[逗号空格]first)

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

    /[^,]+,\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 [ ] ^ \ × ÷
    
    有关按数字顺序列出的字符,请参见。

    该库提供了帮助解决此类任务的工具

    <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>
    
    
    var unicodeWord=XRegExp(“^\\p{L}+$”);
    杜沃德测试(“敻敻敻敻”);//真的
    德沃德测试(“日本語"); // 真的
    unicodeWord.test(“العبي㶡”)//正确
    

    在对问题的评论中提到了它,但它很容易被忽略。我只是在提交了这个答案后才注意到它。

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

    [a-zA-Z\u00C0-\u024F]
    [a-zA-Z\u00C0-\u024F\u1E00-\u1EFF] // includes even more Latin chars
    
    我添加了这些代码块(
    \u00C0-\u024F
    同时包括三个相邻的块):

    • \u00C0-\u00FF
    • \u0100-\u017F
    • \u0180-\u024F
    • \u1E00-\u1EFF
    请注意,
    \u00C0-\u00FF
    实际上只是的一部分。它跳过不可打印的控制信号和所有符号,但笨拙放置的乘法×
    \u00D7
    和除法÷
    \u00F7
    除外

    [a-zA-Z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u024F] // exclude ×÷
    
    如果你需要更多的代码点,你可以在维基百科上找到更多的范围。例如,你也可以添加,和,但我把它们删掉了,因为现在似乎只有历史学家对它们感兴趣,而且D和E集在我的浏览器中甚至不能正确呈现

    最初停在
    \u017F
    的正则表达式是以“Șenol”这个名字命名的。据我所知,第一个字符是
    \u0218
    ,拉丁文大写字母S,下面加逗号。(是的,它通常拼写为cedilla-S
    \u015E
    ,“Şenol.”但我不会飞到土耳其去告诉他,“你的名字拼错了!”)

    来自此wiki:

    对于拉丁字母,我使用

    /^[A-zÀ-ÖØ-öø-ÿ]+$/ 
    
    它避免了连字符和特殊字符

    这个怎么样

    /^[a-zA-ZÀ-ÖØ-öø-ÿ]+$/
    
    ^([a-zA-Z]|[à-ú]|[À-Ú])+$
    
    这个怎么样

    /^[a-zA-ZÀ-ÖØ-öø-ÿ]+$/
    
    ^([a-zA-Z]|[à-ú]|[À-Ú])+$
    
    它将匹配每个单词是否带有重音字符

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

    • \pL
      -匹配来自任何语言的任何类型的字母
    • \pM
      -将一个字符与另一个字符(例如重音符号、元音、包围盒等)组合在一起
    • \p{Zs}
      -匹配不可见但占用空间的空白字符
    • u
      -模式和主题字符串被视为UTF-8
    与其他建议的正则表达式不同(例如
    
    
    /^[\pL\pM\p{Zs}.-]+$/u