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 >
3 Réponses :
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+)
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_ ]*)
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.
Après quelques expérimentations et sur la base des bonnes suggestions ici, je suis venu avec Ce RegEx :
^(.*?) (.*?) (.*?)$
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?
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 >
@CertainPerformance
^
le fait en face, il correspondra à tout sauf{
,4
ou}
ouespace < / code>
Vous avez des quantificateurs (
{4}
) à l'intérieur des classes de caractères ([]
) qui ne feront rien fonctionner. On dirait que^ (. *?) {4} (. *) $
fonctionnerait.