我不确定您为什么想要基于正则表达式的答案。但是,如果这不是绝对必要的,那么您可以通过以下方式检测它。
(免责声明:我不熟悉带有重音字母的欧洲语言,所以我可能在这里错过了一些语言方面。另外,我更熟悉 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']