2011-02-23 7 views
2

Je voudrais capturer n'importe quoi jusqu'à, mais sans inclure un motif particulier. Mon problème actuel a trait à l'analyse de l'information contenue dans html, mais je résume le problème en un exemple pour, espérons-le, clarifier ma question.Regex - motif capture tout sauf motif [.net]

Source

xaxbxcabcabc 

match désiré

xaxbxc 

Si j'utilise un test avant l'expression saisira la première occurrence

.*(?=abc) => xaxbxcabc 

Je voudrais SOMET hing le long des lignes d'une classe de caractères niée, juste pour un motif nié.

.*[^abc] //where abc as a pattern instead of a list giving anything but a, b or c 

J'utilise http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx pour tester

+2

[. Regex n'est pas pour l'analyse syntaxique HTML] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self -contenu-tags/17324 54 # 1732454) –

+1

Vous trouverez peut-être aussi un bon testeur sur http://regexhero.net/tester/. – driis

+0

@ La réponse de Mormegil à l'utilisation de '*?' Est celle que vous voulez. Juste pour info, il est possible d'avoir un lookahead négatif, donc votre dernier bloc de code deviendrait '. * (?! abc)'. Cependant, cela ne semble pas pertinent pour votre situation, pas plus que le lookbehind négatif. '. * (?! abc)' capturerait 'xaxbxcabcabc' de votre échantillon, et'. * (?

Répondre

3

Si vous ancrent les regex vous résoudrez la problème (+ utilisation de quantificateurs paresseux):

"^.*?(?=abc)" 
+0

Merci pour la réponse. C'est la solution que j'ai décidé d'adopter. – Hypnovirus

2

Pourquoi ne pas utiliser un replace:

string result = new Regex("abc.*$").Replace (input, ""); 

Cela supprimera tout de la première phrase correspondant partir, vous laissant avec tout le contenu jusqu'à ce point.

+0

Merci pour la réponse. Pour l'exemple que j'ai utilisé, cela fonctionnerait non seulement, mais serait probablement la solution la plus propre. Cependant, dans le cas où je travaille, cela ajouterait une étape. J'utilise un lookbehind pour lancer le motif. Donc, je devrais tout correspondre après le lookbehind et ensuite faire le remplacement sur ce match. – Hypnovirus

4

Un quantificateur non-gourmand (paresseux) *? pourrait être utile ici, par ex.

^(?<captured>.*?)abc.*$ 

Modifier: Pour être clair, la capture explicite est (bien sûr) ne sont pas nécessaires, la partie vraiment importante est juste

(.*?)abc 
+0

Merci pour la réponse. J'aimerais pouvoir sélectionner plusieurs réponses acceptées. – Hypnovirus