Je copie cette question à partir d'une question récemment supprimée que je trouvais intéressante, mais que j'ai été perplexe en essayant de répondre.

Tl; dr:

Comment faire correspondre les espaces précédés d'au moins 6 caractères qui n'incluent aucun espace correspondant?


J'essaie d'écrire cette expression régulière pour faire correspondre les espaces qui ont 6 caractères ou plus / espace non apparié entre eux, afin que je puisse utiliser .split() pour les diviser en différentes lignes.

Échantillon:

  • Kaiya Devine Rahman
  • Zunairah Field Cairns
  • Oliwia Ramos Smith
  • Donald Ben Ed Jax

Ce que j'ai jusqu'à présent: /(?<=.{6,})\s/g

Cela ne fonctionne pas correctement. Par exemple, il correspond à tous les espaces du nom de famille (résultat de la division: ['Donald', 'Ben', 'Ed', 'Jax']). Au lieu de cela, je veux que le résultat du fractionnement soit ['Donald', 'Ben Ed', 'Jax']. Comment faire pour qu'après la première correspondance (l'espace après Donald), il commence à rechercher à partir de cet index à la place?

screenshot of regex and matches

0
GirkovArpa 2 sept. 2020 à 02:54

4 réponses

Meilleure réponse

La réponse est (?<=(\S|(?<!\S{6,})\s){6,})\s

Testez-le ici sur Regex101

1
Dominique Fortin 2 sept. 2020 à 03:40

J'ai adopté l'approche suivante pour éviter l'utilisation de lookbehinds car je comprends qu'ils ne sont pas pris en charge par tous les navigateurs.

Si vous correspondez à l'expression régulière suivante, il y a un espace d'intérêt immédiatement après chaque correspondance.

/(?:^| ).{6}[^ \n]*(?= )/

Démarrez votre moteur!

Si, par exemple, la chaîne était:

"Now is the time for exceptional  Rubiests to be extra vigilent in the testing phases"

Il y aurait 8 correspondances (notez qu'il y a deux espaces avant 'Rubiests'):

"Now is"
" the time"
" for exceptional"
"  Rubiests"
" to be extra
" vigilent"
" in the"
" testing"

Le premier caractère de chaque correspondance, mais le premier, est un espace correspondant; autrement dit, cet espace est précédé d'au moins 6 caractères qui suivent le dernier espace correspondant ou le début de la chaîne.

Ces 8 correspondances, lorsqu'elles sont concaténées, forment la première partie de la chaîne. Il est donc facile de calculer l'indice de chaque espace apparié.

0
Cary Swoveland 2 sept. 2020 à 03:49

Je ferais quelque chose de plus comme:

function separateName(name){
  const a = name.split(/\s+/);
  if(a.length > 3){
    a[1] += ' '+a.splice(2, 1);
  }
  return a;
}
const testArray = ['Kaiya Devine Rahman', 'Zunairah Field Cairns', 'Oliwia Ramos Smith', 'Donald Ben Ed Jax'];
for(let n of testArray){
  console.log(separateName(n));
}
0
StackSlave 2 sept. 2020 à 00:28

N'est-ce pas simple /(^\w+)\s(.+)\s(\w+)$/ ce dont vous avez vraiment besoin? https://regex101.com/r/phAKGH/1

0
olkivan 2 sept. 2020 à 00:15