【问题标题】:Javascript Regex to check if a string contains accented charactersJavascript Regex 检查字符串是否包含重音字符
【发布时间】:2021-11-30 15:54:44
【问题描述】:

我目前正在检查字符串是否包含重音字符。例如

hellohello  ---> return true
helloéèhello  ---> return false because the text contains accent characters 

谁能帮我用正则表达式

谢谢

【问题讨论】:

  • 这个话题能回答你的问题吗? stackoverflow.com/questions/201323/…
  • 请注意,某些电子邮件地址中允许使用重音符号(取决于地址的域),但强烈建议不要这样做。
  • @vincent, (a) 您是否只需要检测重音字符的存在还是提取它们? (b) 您为此使用正则表达式的动机是什么?非基于正则表达式的解决方案适合您吗?

标签: javascript regex


【解决方案1】:

我不确定您为什么想要基于正则表达式的答案。但是,如果这不是绝对必要的,那么您可以通过以下方式检测它。

(免责声明:我不熟悉带有重音字母的欧洲语言,所以我可能在这里错过了一些语言方面。另外,我更熟悉 Java,这里的 JavaScript 可能不是最佳。)

ASCII

如果您的文本是 ASCII,那么除了循环遍历字符数组并比较其 ASCII 值以查看它是否是重音字符之一之外,我别无他法。您可以从1 循环到255 并打印字符。

重音字符,如我所见,从192 开始。但是,并非所有超出此范围的角色都是如此,因此您必须与正确的集合进行比较。

这是一个伪代码,它说明了我的意思。 (我不擅长 JavaScript。)

/* This array has to be prepared by looking at all ASCII characters till 255. */
char[] accented = new char[]{ (char) 192, (char) 193, ... };
for( let c of Array.from( 'helloéèhello' ) ){
    if( isPresentIn( c, accented ) ){
        console.log( "Accented chars present" )
        break;
    }
}

Unicode

如果这是一个 Unicode 文本,有一种间接的方法可以使用 Unicode 字符的规范化来做到这一点。在 Unicode 中,重音字符通常是复合字符。因此,您可以分解字符并检查它是否包含大于代码点 256 的组件。

详细了解可以看https://www.unicode.org/reports/tr15/tr15-23.html的描述。

这并不完美,但可以很好地指导您提出更完整的设计。

在 JavaScript 中分解:

'helloéèhello'.normalize( 'NFD' )

例如,é 分解为 e 和代码点 768,è 分解为 e 和代码点 769。

注意没有和标准化后字符的差异。

Array.from( 'helloéèhello'.normalize( 'NFD' ) )
(14) ['h', 'e', 'l', 'l', 'o', 'e', '́', 'e', '̀', 'h', 'e', 'l', 'l', 'o']

Array.from( 'helloéèhello' )
(12) ['h', 'e', 'l', 'l', 'o', 'é', 'è', 'h', 'e', 'l', 'l', 'o']

【讨论】:

  • 谢谢,很有帮助
【解决方案2】:

如果您正在尝试检查电子邮件,请查看 alex 建议的答案,但如果您只想检查上述两个测试用例,请点击此处。

请注意,这不是为了测试有效的电子邮件,只是为了测试一些有效的字符串

^[a-zA-Z@._]*[a-zA-z0-9]$

^ 开头 [a-zA-Z0-9@._] lowercase, uppercase, digits, @, .&_are valid characters meaning accent and other symbols are not valid*greedy select matching previous character sets[a-zA-z0-9]$` 以字母数字数据结尾。

示例

hello@gmail.com   ---> return true
helloégmail  ---> return false because the text contains accent characters 
hello1 -> true
test@ -> false as it should end with alphanumeric character

【讨论】:

    猜你喜欢
    • 2015-11-09
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 2015-03-15
    • 2016-08-01
    • 2017-02-10
    • 1970-01-01
    • 2011-11-09
    相关资源
    最近更新 更多