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

时间:2018-04-12 09:48:19

标签: javascript regex

假设我有以下字符串:

var englishSentence = 'Hellow World';
var persianSentence = 'گروه جوانان خلاق';

对于英语,我使用以下正则表达式,但我怎么能写一个正则表达式来支持波斯语,或者混合它们。

  var matches = englishSentence.match(/\b(\w)/g);
  acronym = matches.join('');

4 个答案:

答案 0 :(得分:6)

根本原因

无法匹配Unicode字边界,即使在ECMA 2018中,\b也无法识别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));

<强>详情

  • (?<!\p{L}\p{M}*) - 如果有一个Unicode字母后面跟着0+变音符号,那么会导致匹配失败的负面后瞻
  • \p{L}\p{M}* - 带有0+变音符号的Unicode字母
  • 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));
<script src="https://cdnjs.cloudflare.com/ajax/libs/xregexp/3.2.0/xregexp-all.js"></script>

<强>详情

  • (?:^|[^\\pL\\pM]) - 与字符串开头(^)或除Unicode字母或变音符之外的任何字符匹配的非捕获组
  • (\\pL\\pM*) - 第1组:任何带有0+变音符号的Unicode字母。

在这里,我们需要提取第1组值,因此在每次匹配时都会提取.push(match[1])

答案 1 :(得分:1)

您可以按空格分割,然后获取每个项目的第一个字符

var output = sentence.split( /\s+/ ).map( s => s.charAt(0) ).join("")

<强>演示

&#13;
&#13;
var fnGetFirstChar = (sentence) => sentence.split( /\s+/ ).map( s => s.charAt(0) ).join("");

var englishSentence = 'Hellow World';
var persianSentence = 'گروه جوانان خلاق';

console.log( fnGetFirstChar( englishSentence ) );

console.log( fnGetFirstChar( persianSentence ) );
&#13;
&#13;
&#13;

答案 2 :(得分:1)

如果你在代码中这样做,一种方法是使用

(?:\s|^)(\S)

它匹配非空格字符(\S),前面是空格或字符串开头(\s|^),捕获非空白字符以捕获组1。

&#13;
&#13;
var sentence  = 'Hello World\n'+
                'گروه جوانان خلاق',
    re        = /(?:\s|^)(\S)/g,
    result = '';
    
while( m = re.exec(sentence) )
{
  result += m[1];
};

console.log( result );
&#13;
&#13;
&#13;

答案 3 :(得分:1)

您最好使用آی以及a-z的字符范围,因为JS中的字边界无法识别多字节字母,而在大多数情况下都是如此。< / p>

console.log(
  "سلام حالت چطوره؟".match(/( |^)[آ-یa-z](?=[آ-یa-z])/gi).map(x => x.trim()).join('')
)

console.log(
  "این یک test است".match(/( |^)[آ-یa-z](?=[آ-یa-z])/gi).map(x => x.trim()).join('')
)

故障:

  • (?: |^)匹配空格或输入字符串的开头
  • [آ-ی]匹配来自波斯语的角色
  • (?=开始积极向前看
    • [آ-ی]如果跟着另一个波斯语字符
  • )结束了积极的向前看

注意:从آ到ی的字符范围中有超过波斯语字母(也有一些阿拉伯字母)以进行精确匹配(我怀疑你是否在任何地方使用这些字母)使用一个坚实的字符类:

[اآبپتثجچحخدذرزژسشصضطظعفقگکلمنوهی]

console.log(
    "سلام دوست من".match(/( |^)[اآبپتثجچحخدذرزژسشصضطظعفقگکلمنوهیa-z](?=[اآبپتثجچحخدذرزژسشصضطظعفقگکلمنوهیa-z])/gi).map(x => x.trim()).join('')
)