JavaScript正则表达式获取句子中每个单词的第一个字符(波斯语和英语句子)

jon*_*nes 3 javascript regex

假设我有以下字符串:

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)

Wik*_*żew 6

根本原因

无法匹配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])在每次匹配时.