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

koaltpgm  于 2023-11-20  发布在  Java
关注(0)|答案(5)|浏览(204)

假设我有以下字符串:

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

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

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

xuo3flqw

xuo3flqw1#

根本原因

无法匹配Unicode字边界,即使在ECMA 2018中,\b也不支持Unicode。

解决方案

对于兼容ECMA 2018的浏览器(例如截至2018年4月的最新版本的Chrome),您可以用途:

  1. var englishSentence = 'Hellow World';
  2. var persianSentence = 'گروه جوانان خلاق';
  3. var reg = /(?<!\p{L}\p{M}*)\p{L}\p{M}*/gu;
  4. console.log(englishSentence.match(reg));
  5. console.log(persianSentence.match(reg));

字符串

详情

  • (?<!\p{L}\p{M}*)-如果Unicode字母后跟0+附加符号,则匹配失败的负向后查找
  • \p{L}\p{M}*-Unicode字母,后跟0+附加符号
  • gu-g-全局,搜索所有匹配项,u-使模式支持Unicode。

如果您需要在旧版/其他浏览器中使用相同的功能,请使用XRegExp

  1. function getFirstLetters(s, regex) {
  2. var results=[], match;
  3. XRegExp.forEach(s, regex, function (match, i) {
  4. results.push(match[1]);
  5. });
  6. return results;
  7. }
  8. var rx = XRegExp("(?:^|[^\\pL\\pM])(\\pL\\pM*)", "gu");
  9. console.log(getFirstLetters("Hello world", rx));
  10. console.log(getFirstLetters('گروه جوانان خلاق', rx));
  1. <script src="https://cdnjs.cloudflare.com/ajax/libs/xregexp/3.2.0/xregexp-all.js"></script>

的数据

详情

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

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

展开查看全部
xurqigkl

xurqigkl2#

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

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

字符串

Demo

  1. var fnGetFirstChar = (sentence) => sentence.split( /\s+/ ).map( s => s.charAt(0) ).join("");
  2. var englishSentence = 'Hellow World';
  3. var persianSentence = 'گروه جوانان خلاق';
  4. console.log( fnGetFirstChar( englishSentence ) );
  5. console.log( fnGetFirstChar( persianSentence ) );

展开查看全部
yvt65v4c

yvt65v4c3#

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

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

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

  1. var sentence = 'Hello World\n'+
  2. 'گروه جوانان خلاق',
  3. re = /(?:\s|^)(\S)/g,
  4. result = '';
  5. while( m = re.exec(sentence) )
  6. {
  7. result += m[1];
  8. };
  9. console.log( result );

展开查看全部
2sbarzqh

2sbarzqh4#

最好使用从آی沿着的字符范围和a-z,因为JS中的单词边界不能识别多字节字母,而在大多数风格中它可以。

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

字符串
细分:

  • (?: |^)匹配输入字符串的空格或开头
  • [آ-ی]匹配波斯语中的字符
  • (?=启动积极的前瞻
  • [آ-ی]如果后跟另一个波斯语字符
  • )正向前瞻结束

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

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

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

展开查看全部
jgzswidk

jgzswidk5#

在JS中,你可以模拟一个单词边界。
可能相关的是,您可以通过启用引擎Unicode选项并使用属性[\p{L}\p{N}_]来定义一个单词,然后只需对左/右边界进行数学运算。

  1. /(?:(?<![\p{L}\p{N}_])(?=[\p{L}\p{N}_])|(?<=[\p{L}\p{N}_])(?![\p{L}\p{N}_]))/gu

字符串
这是一个韩语示例,但适用于任何Unicode。
https://regex101.com/r/Mjttej/1

  1. (?: # Cluster start
  2. (?<! [\p{L}\p{N}_] ) # Lookbehind assertion for a char that is NOT a word
  3. (?= [\p{L}\p{N}_] ) # Lookahead assertion for a char that is IS a word
  4. | # or,
  5. (?<= [\p{L}\p{N}_] ) # Lookbehind assertion for a char that is IS a word
  6. (?! [\p{L}\p{N}_] ) # Lookahead assertion for a char that is NOT a word
  7. # -------
  8. ) # Cluster end

展开查看全部

相关问题