Supposons que j'ai la chaîne suivante:

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

Pour l'anglais, j'utilise les expressions rationnelles suivantes, mais comment puis-je écrire une expression régulière pour prendre en charge le persan, ou un mélange d'entre eux.

  var matches = englishSentence.match(/\b(\w)/g);
  acronym = matches.join('');
3
jones 12 avril 2018 à 12:48

4 réponses

Meilleure réponse

Cause première

Il n'y a aucun moyen de faire correspondre une limite de mot Unicode, \b n'est pas compatible avec Unicode même dans ECMA 2018.

Solutions

Pour les navigateurs compatibles ECMA2018 (par exemple, les dernières versions de Chrome en avril 2018), vous pouvez utiliser:

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));

Détails

  • (?<!\p{L}\p{M}*) - un lookbehind négatif qui échoue la correspondance s'il y a une lettre Unicode suivie de 0+ signes diacritiques
  • \p{L}\p{M}* - une lettre Unicode suivie de 0+ signes diacritiques
  • gu - g - global, recherche toutes les correspondances, u - rend le modèle Unicode sensible.

Si vous avez besoin des mêmes fonctionnalités dans les anciens navigateurs / autres navigateurs, utilisez 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>

Détails

  • (?:^|[^\\pL\\pM]) - un groupe non capturant qui correspond au début de la chaîne (^) ou tout caractère autre qu'une lettre Unicode ou diacritique
  • (\\pL\\pM*) - Groupe 1: toute lettre Unicode suivie de 0+ signes diacritiques.

Ici, nous devons extraire la valeur du groupe 1, donc .push(match[1]) à chaque correspondance.

6
Wiktor Stribiżew 12 avril 2018 à 10:29

Vous feriez mieux d'utiliser une plage de caractères de آ à ی avec a-z car une limite de mot dans JS ne reconnaît pas les lettres multi-octets alors que dans la plupart des versions, elle le fait.

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('')
)

Panne:

  • (?: |^) Correspond à un espace ou au début de la chaîne d'entrée
  • [آ-ی] Faites correspondre un personnage de persan
  • (?= Lancer une anticipation positive
    • [آ-ی] S'il est suivi d'un autre caractère farsi
  • ) Fin de l'anticipation positive

Remarque: la plage de caractères de آ à ی contient plus que des alphabets farsi (certaines lettres arabes aussi) pour une correspondance précise (je doute que vous utilisiez ces lettres n'importe où) utilisez une classe de caractères solides:

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

Si vous faites cela dans le code, une façon de le faire est avec

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

Il correspond à un caractère non blanc (\S) précédé d'un espace blanc OU au début d'une chaîne (\s|^), capturant le caractère non blanc pour capturer le groupe 1.

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

console.log( result );
1
SamWhan 12 avril 2018 à 10:54

Vous pouvez diviser par espace (s), puis obtenir le premier caractère de chaque élément

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

Démo

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 ) );
1
gurvinder372 12 avril 2018 à 10:17