假设我有以下字符串:
var englishSentence = 'Hellow World';
var persianSentence = '???? ?????? ????';
Run Code Online (Sandbox Code Playgroud)
对于英语我使用以下正则表达式,但我怎么能写一个正则表达式来支持波斯语,或者混合它们.
var matches = englishSentence.match(/\b(\w)/g);
acronym = matches.join('');
Run Code Online (Sandbox Code Playgroud)
无法匹配Unicode字边界,\b即使在ECMA 2018中也无法识别Unicode.
对于ECMA2018兼容浏览器(例如,截至2018年4月的Chrome的最新版本),您可以使用:
var englishSentence = 'Hellow World';
var persianSentence = '???? ?????? ????';
var reg = /(?<!\p{L}\p{M}*)\p{L}\p{M}*/gu;
console.log(englishSentence.match(reg));
console.log(persianSentence.match(reg));Run Code Online (Sandbox Code Playgroud)
细节
(?<!\p{L}\p{M}*) - 如果有一个Unicode字母后面跟着0+变音符号,则会导致匹配失败的负面观察\p{L}\p{M}* - 一个Unicode字母后跟0+变音符号gu- g- 全局,搜索所有匹配项,u- 使模式识别Unicode.如果您需要在旧版/其他浏览器中使用相同的功能,请使用XRegExp:
function getFirstLetters(s, regex) {
var results=[], match;
XRegExp.forEach(s, regex, function (match, i) {
results.push(match[1]);
});
return results;
}
var rx = XRegExp("(?:^|[^\\pL\\pM])(\\pL\\pM*)", "gu");
console.log(getFirstLetters("Hello world", rx));
console.log(getFirstLetters('???? ?????? ????', rx));Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/xregexp/3.2.0/xregexp-all.js"></script>Run Code Online (Sandbox Code Playgroud)
细节
(?:^|[^\\pL\\pM])- 与字符串(^)的开头或Unicode字母或变音符号以外的任何字符匹配的非捕获组(\\pL\\pM*) - 第1组:任何Unicode字母后跟0+变音符号.在这里,我们需要提取第1组值,因此.push(match[1])在每次匹配时.
| 归档时间: |
|
| 查看次数: |
136 次 |
| 最近记录: |