假设我有以下字符串:
var englishSentence = 'Hellow World';
var persianSentence = 'گروه جوانان خلاق';
对于英语,我使用以下正则表达式,但我怎么能写一个正则表达式来支持波斯语,或者混合它们。
var matches = englishSentence.match(/\b(\w)/g);
acronym = matches.join('');
答案 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("")
<强>演示强>
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;
答案 2 :(得分:1)
如果你在代码中这样做,一种方法是使用
(?:\s|^)(\S)
它匹配非空格字符(\S
),前面是空格或字符串开头(\s|^
),捕获非空白字符以捕获组1。
var sentence = 'Hello World\n'+
'گروه جوانان خلاق',
re = /(?:\s|^)(\S)/g,
result = '';
while( m = re.exec(sentence) )
{
result += m[1];
};
console.log( result );
&#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('')
)