2
votes

RegEx pour N nombre d'espaces dans une chaîne

Je cherche à créer des groupes séparés par 4 espaces Le problème est que si le groupe contient un espace, autre que le séparateur d'espaces 4, il n'y a pas de correspondance avec l'expression régulière que j'ai essayée jusqu'à présent

C'est ce que j'ai essayé. Disons que j'ai ces 2 lignes, avec 4 espaces entre les mots

^([^ {4}]*) {4}([^ {4}]*)$

et le regex est

word 1    word 2
word1    word2

Cela correspond seulement la 2ème ligne. La présence d'un espace autre que le séparateur d'espaces 4 ne correspondra pas à la ligne.

Je m'attends à faire correspondre et à identifier les groupes corrects, dans ces deux lignes.

p >


2 commentaires

@CertainPerformance ^ le fait en face, il correspondra à tout sauf {, 4 ou } ou espace < / code>


Vous avez des quantificateurs ( {4} ) à l'intérieur des classes de caractères ( [] ) qui ne feront rien fonctionner. On dirait que ^ (. *?) {4} (. *) $ fonctionnerait.


3 Réponses :


0
votes

Ce RegEx peut vous aider à diviser vos chaînes d'entrée en cinq groupes, le second et les quatrièmes groupes sont les quatre espaces:

(\w+)(\s{4})(\w+)(\s{4})(\w+)

entrez la description de l'image ici

Si vous n'avez pas d'espace kbd> dans vos colonnes, vous pouvez le simplifier en utilisant ce RegEx :

([a-zA-Z0-9_ ]*)(\s{4})([a-zA-Z0-9_ ]*)(\s{4})([a-zA-Z0-9_ ]*)    

 entrez la description de l'image ici


3 commentaires

J'ai mis à jour l'exemple regex101.com/r/MxG4XU/2 Il y aura toujours le même montant de séparateurs (4 espaces) dans chaque ligne. Cependant, il ne peut pas y avoir de chaîne entre 2 groupes de 4 lignes consécutives. Voir la ligne 2, avec 8 espaces à la fin. Dans ce cas, ce regex ne le fait pas. J'ai également ajouté la ligne de début ^ et $ end, mais vous pouvez le voir dans le 3ème match, il faut plusieurs lignes. Je ne comprends pas pourquoi


Pourquoi utilisez-vous parfois \ s et parfois [] ? Idem pour \ w et [A-Za-z0-9_] . Je ne vois aucun schéma sensé ici.


([a-zA-Z0-9_] *) (\ s {4}) ([a-zA-Z0-9_] *) (\ s {4}) ([a-zA-Z0-9_] *) est le plus proche, car il tient compte des valeurs vides dans les colonnes. Cependant, les caractères peuvent être n'importe quoi, pas seulement a-zA-Z0-9_ Fondamentalement, ce qui est nécessaire entre les 4 séparateurs d'espace est: correspond à n'importe quel caractère dans n'importe quel nombre ou vide, sauf 4 espaces.



1
votes

Après quelques expérimentations et sur la base des bonnes suggestions ici, je suis venu avec Ce RegEx :

^(.*?)    (.*?)    (.*?)$

 entrez la description de l'image ici

En surface, il fait ce dont j'ai besoin. La dernière ligne a plus de 4 blocs d'espace à la fin, mais cela ne devrait pas arriver. Un piège que je ne vois pas?


0 commentaires

1
votes

Au lieu d'utiliser une approche non gourmande en étoile . *? , vous pouvez spécifier les caractères que vous souhaitez faire correspondre.

Si vos données ne contiennent par exemple que des mots, vous pouvez correspondre à 1 + caractères de mots \ w + suivis d'un motif répétitif (\ w + (?: \ w +) *) pour faire correspondre un espace et 1+ mots de caractères suivis de 4 espaces correspondants.

Notez que si vous voulez faire correspondre plus qu'un mot, vous pouvez utiliser un classe de caractères et ajoutez les caractères que vous autorisez à faire correspondre.

^(\w+(?: \w+)*) {4}(\w+(?: \w+)*) {4}(\w+(?: \w+)*)$

Démo Regex p >


0 commentaires