2009-10-12 9 views
0

Nous avons une chaîne que nous devons analyser à l'aide regex, la chaîne pourrait être:Comment faire correspondre une chaîne avec une pièce optionnelle?

  1. Il y avait un problème à XXXX
  2. Il y avait un problème à XXXX, les échecs précédents étaient YYY

Le XXX pourrait être un caractère (par exemple "")

Comment pouvons-nous faire regex qui correspondent à:

  1. XXXX
  2. "les échecs précédents étaient YYY" (souvenez-vous pourrait être facultatif)

Chaque regex que j'ai essayé des captures sur le premier tout match (parce que gourmand ou trop peu, car pas gourmand)

Je sais que c'est une avancée, mais peut-être que quelqu'un l'a déjà fait.

+3

Quelle regexp? Quelle langue ? –

+0

S'il vous plaît voir mon édition pour plus. –

Répondre

6
^There was a problem at (.*?)(?:, previous failures were (.*))?$ 

(.*?) signifie que tout correspond, mais correspondent aussi peu que possible de ce match de match. Les ancres ^ et $ forcent l'expression régulière à s'étendre sur toute la ligne afin qu'elle corresponde toujours à quelque chose. Selon le:

EDIT: Si vous voulez vraiment le texte d'erreur entourant, et non pas seulement "XXX" et "YYY", puis utilisez l'expression rationnelle suivante à la place:

^There was a problem at (.*?)(, previous failures were .*)?$ 

EDIT 2 Au format XXX, vous pourrez peut-être vous passer de ce qui suit, mais seulement s'il n'y a pas de virgule dans "XXX". Malheureusement, en dehors de cela, vous avez besoin d'au moins l'ancre $ pour s'assurer que le match non-gourmand correspond à quelque chose. Comme vous l'avez noté dans votre question, l'utilisation d'un match gourmand n'est pas une option du tout (en utilisant . atleast).

There was a problem at ([^,]*)(, previous failures were .*)? 
+1

Pourquoi ne pas capturer les secondes parenthèses? Il voulait faire correspondre le texte environnant. –

+0

Parce que les troisièmes parent ** capturent **, mais je doute qu'il se soucie du texte d'erreur statique. –

+0

Ok, je viens de relire la question et relire ce que vous avez écrit et compris. Edité dedans, mais je pense toujours que c'est un problème de communication plus que ce qu'il veut vraiment/a besoin. –

2

A Perl, Java, Python, .NET, JavaScript, etc. regex pourrait être

^There was a problem at (.*?)(, previous failures were .*)?$ 
compatible

si je comprends bien votre question. Si vous avez besoin d'un échantillon de code, veuillez fournir plus de détails.

Questions connexes