Как сопоставить строку с необязательной частью? - PullRequest
0 голосов
/ 12 октября 2009

У нас есть строка, которую нам нужно проанализировать с помощью регулярных выражений, строка может быть либо:

  1. В XXXX возникла проблема
  2. В XXXX была проблема, предыдущие сбои были ГГГ

XXX может быть любым символом (например, ".")

Как мы можем сделать регулярное выражение, которое будет соответствовать:

  1. XXXX
  2. ", предыдущие ошибки были YYY" (помните, может быть необязательным)

Каждое регулярное выражение, которое я пробовал, захватывает в первом совпадении все (потому что жадный или слишком маленький, потому что не жадный)

Я знаю, что это заранее, но, возможно, кто-то уже сделал это.

Ответы [ 2 ]

6 голосов
/ 12 октября 2009
^There was a problem at (.*?)(?:, previous failures were (.*))?$

(.*?) означает совпадать со всеми, но сопоставлять как можно меньше, чтобы совпадение совпадало. Якоря ^ и $ заставляют регулярное выражение охватывать всю строку, чтобы оно всегда совпадало с чем-либо.

РЕДАКТИРОВАТЬ: Если вам действительно нужен окружающий текст ошибки, а не только "XXX" и "YYY", используйте вместо этого следующее регулярное выражение:

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

РЕДАКТИРОВАТЬ 2: В зависимости от формата XXX, вы можете избежать следующих действий, но только если в «XXX» нет запятых. К сожалению, кроме этого, вам нужно как минимум $ якорь, чтобы убедиться, что не жадное совпадение будет что-то совпадать. Как вы отметили в своем вопросе, использование жадного совпадения вообще не вариант (при использовании . по крайней мере).

There was a problem at ([^,]*)(, previous failures were .*)?
2 голосов
/ 12 октября 2009

Регулярное выражение, совместимое с Perl, Java, Python, .NET, JavaScript и т. Д., Может быть

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

если я правильно понимаю ваш вопрос. Если вам нужен пример кода, пожалуйста, предоставьте более подробную информацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...