这是我今天遇到的一个有趣的片段:
/\ba/.test("a") --> true
/\bà/.test("à") --> false
然而,
/à/.test("à") --> true
首先,wtf?
其次,如果我想在单词的开头匹配一个带重音的字符,我该怎么做?(我真的很想避免使用像 那样的顶级选择器/(?:^|\s|'|\(\) ....
)
这是我今天遇到的一个有趣的片段:
/\ba/.test("a") --> true
/\bà/.test("à") --> false
然而,
/à/.test("à") --> true
首先,wtf?
其次,如果我想在单词的开头匹配一个带重音的字符,我该怎么做?(我真的很想避免使用像 那样的顶级选择器/(?:^|\s|'|\(\) ....
)
/\bà/.test("à")
不匹配的原因是因为“à”不是单词字符。转义序列\b
仅在单词字符和非单词字符的边界之间匹配。/\ba/.test("a")
匹配,因为“a”是一个单词字符。因此,字符串的开头(不是单词字符)和作为单词字符的字母“a”之间存在边界。
JavaScript 正则表达式中的单词字符定义为[a-zA-Z0-9_]
.
要匹配字符串开头的重音字符,只需使用^
正则表达式开头的字符(例如/^à/
)。该字符表示字符串的开头(与\b
在字符串内的任何单词边界处匹配的字符不同)。它是最基本和标准的正则表达式,所以它绝对不是最重要的。
const regex = /^[\-/A-Za-z\u00C0-\u017F ]+$/;
const test1 = regex.test("à");
const test2 = regex.test("Martinez-Cortez");
const test3 = regex.test("Leonardo da vinci");
const test4 = regex.test("ï");
console.log('test1', test1);
console.log('test2', test2);
console.log('test3', test3);
console.log('test4', test4);
基于 Wak 和 Cœur 的回答:
/^[\-/A-Za-z\u00C0-\u017F ]+$/
也适用于空格和破折号。
示例:列奥纳多·达·芬奇、马丁内斯-科尔特斯
如果您想匹配字母,无论它们是否带有重音符号,unicode 属性转义都会有所帮助。
/\p{Letter}*/u.test("à"); // true
/\p{Letter}/u.test('œ'); // true
/\p{Letter}/u.test('a'); // true
/\p{Letter}/u.test('3'); // false
/\p{Letter}/u.test('a'); // true
匹配单词的开头很棘手,但(?<=(?:^|\s))
似乎可以解决问题。这(?<= )
是一个积极的回顾,确保在主要表达之前存在某些东西。这(?: )
是一个非捕获组,因此您在以后使用的任何匹配项中都不会引用此部分。然后,^
如果未设置多行标志,则匹配字符串的开头,如果设置了多行标志,\s
则匹配行的开头,并且将匹配空白字符(空格/制表符/换行符)。
所以一起使用它们,它看起来像:
/(?<=(?:^|\s))\p{Letter}*/u
如果你想只重音字符匹配字符串的开始,你会想要一个-ZA-Z一个否定的字符集。
/(?<=(?:^|\s))[^a-zA-Z]\p{Letter}*/u.match("bœ") // false
/(?<=(?:^|\s))[^a-zA-Z]\p{Letter}*/u.match("œb") // true
// Match characters, accented or not
let regex = /\p{Letter}+$/u;
console.log(regex.test("œb")); // true
console.log(regex.test("bœb")); // true
console.log(regex.test("àbby")); // true
console.log(regex.test("à3")); // false
console.log(regex.test("16 tons")); // true
console.log(regex.test("3 œ")); // true
console.log('-----');
// Match characters to start of line, only match characters
regex = /(?<=(?:^|\s))\p{Letter}+$/u;
console.log(regex.test("œb")); // true
console.log(regex.test("bœb")); // true
console.log(regex.test("àbby")); // true
console.log(regex.test("à3")); // false
console.log('----');
// Match accented character to start of word, only match characters
regex = /(?<=(?:^|\s))[^a-zA-Z]\p{Letter}+$/u;
console.log(regex.test("œb")); // true
console.log(regex.test("bœb")); // false
console.log(regex.test("àbby")); // true
console.log(regex.test("à3")); // false