2008-11-24 4 views

Répondre

14
(\\ |[^ ])+ 

Tout sauf les espaces, sauf lorsqu'ils sont échappés. Devrait travailler, désolé d'avoir mal compris votre question au départ.

+0

Cela ne devrait-il pas être "\\"? –

+0

Ceci correspondra à une ligne vide ainsi qu'à un [TAB] b. – phihag

+0

+1 pour la solution plus simple et compatible. Toutes les saveurs de regex ne sont pas look-behind. – Tomalak

5
(\S|(?<=\\))+ 

Explication:

que vous recherchez soit des caractères non blancs (espace \S) ou un espace précédé d'une barre oblique inverse, plusieurs fois.

Toutes les correspondances seront enregistrées dans le groupe de machines 1, appliquez le motif globalement pour obtenir toutes les correspondances dans la chaîne.

EDIT

Penser à ce sujet, vous auriez même pas besoin de capturer un sous-groupe. Le seul match sera assez, alors cela pourrait être un petit peu plus efficace (les ?: commutateurs à un groupe non-capture):

(?:\S|(?<=\\))+ 
+0

J'ai d'abord choisi votre réponse à cause du commentaire sur la correspondance de aTABb de Stefan, mais la vôtre aussi.Les deux réponses sont bonnes, et résolvent mon problème, mais pour être honnête, Stafan était plus tôt –

+0

J'ai changé le motif pour qu'il ne corresponde plus à TAB ou autre espace blanc. – Tomalak

1

je le ferais comme ceci:

/[^ \\]*(?:\\ [^\\ ]*)*/ 

Cette est l'idiome de "boucle déroulée" de Friedl. Il y aura probablement très peu d'espaces échappés dans la chaîne cible par rapport aux autres personnages, donc vous engloutirez autant d'autres personnages que vous le pouvez à chaque fois que vous avez une chance. C'est beaucoup plus efficace qu'une alternance correspondant à un caractère à la fois. Editer: (Tomalak) Je place des barres obliques autour de la regex car la syntaxe surligneur semble les reconnaître et peint toute la regex en une seule couleur. Sans eux, il peut ramasser sur d'autres caractères, comme des guillemets, et incorrectement (et de façon confuse) peindre des parties de l'expression régulière dans différentes couleurs. (OP) L'OP ne mentionnait que les espaces, donc je ne permettais que de les citer, mais vous avez raison. L'exemple original de la boucle déroulée dans le livre concernait les chaînes entre guillemets, qui pouvaient contenir plusieurs séquences d'échappement, dont l'une est un guillemet échappé. Voici la regex:

/"[^\\"]*(?:\\.[^\\"]*)*"/ 

(Tomalak) Je ne sais pas ce que vous voulez dire quand vous dites qu'il ne correspond pas à « le nom du fichier au début de la chaîne. » Il semble correspondre aux deux noms de fichiers dans l'exemple de l'OP. Cependant, il correspond également à une chaîne vide, ce qui n'est pas bon. Cela peut être réparé, mais à moins de prouver que l'efficacité est un problème, cela n'en vaut pas la peine. La solution de Stefan fonctionne bien.

+0

En fait, en Java, je voudrais une regex plus simple en utilisant des quantificateurs possessifs et/ou des groupes atomiques. Mais la boucle déroulée fonctionnera dans n'importe quelle langue. –

+0

Cela ne correspond pas au nom du fichier au début de la chaîne. – Tomalak

+0

'(?: \\ [^] *?) *' Pourrait être mieux, si par exemple 'ab \ cd' serait une correspondance valide. –

Questions connexes