2013-02-12 4 views
1

Я пытаюсь выяснить довольно простое регулярное выражение, но я не могу его восстановить, почему он не работает. Я думал, что я в регулярное выражение вещи, но, к сожалению, это не кажется так: DРегулярные выражения, пример для новичков

Вот выражение, которое я хочу, чтобы соответствовать:

interval=4|termination=2012-09-18 22:00:00|days=3

тем, что я хочу иметь соответствующий массив, который выглядит так или иначе, как этот

match = array({"interval" => "4", "termination" => "2012-09-18 22:00:00", "days" = "3"}); 
//(pseudocode) 

Я использую его в C#, для этого я хочу, чтобы иметь имена шаблонов. Я попробовал это с этим рисунком:

(.*)((termination=(?<termination>(.{19})))|(interval=(?<interval>(\d*)))|(days=(?<days>(\d*))))*(.*) 

Может ли кто-нибудь указать, где я терпит неудачу?

Thx заранее

+0

где ваше регулярное выражение? –

+1

Вы протестировали его с помощью инструмента регулярного выражения?Многие инструменты разлагают полученные вами совпадения (или отсутствующие совпадения), которые могут помочь. Я использую бесплатный RAD Regex Designer (http://www.radsoftware.com.au/regexdesigner/), но есть и другие. –

+1

Я могу порекомендовать regex101.com –

ответ

3

Я считаю, что вы едете из PHP фона, вы можете использовать string.Split и форсировать выход к словарю, как:

string str = "interval=4|termination=2012-09-18 22:00:00|days=3"; 
Dictionary<string,string> dict = str.Split('|') 
            .Select(r => r.Split('=')) 
            .ToDictionary(t => t[0], t=> t[1]); 

и результат будет:

enter image description here

+0

Спасибо за этот ответ, это, безусловно, один из способов сделать это в этом случае, но я ищу подход с регулярным выражением для создания более сложных способов использования. –

1

| специальный символ для регулярного выражения, что означает чередование. Поскольку вы хотите сопоставить литерал |, вам нужно его избежать.

interval=(?<interval>\d*)\|termination=(?<termination>.{19})\|days=(?<days>\d*) 

У меня также есть свобода, чтобы очистить группы захвата, которые вам не нужны. Я также изменил регулярное выражение, так что он работает с методом Regex.Matches().

Я предполагаю, что вход отображается в указанном порядке.

+1

Но порядок все еще неверен – leppie

+0

К OP: Я не уверен, что вы пытаетесь использовать '|' в своем регулярном выражении. Если вход поступает в том же порядке, что и показано, то созданное мной регулярное выражение будет работать. В противном случае требуется дополнительная модификация. – nhahtdh

+0

Привет! Спасибо за это предложение. Да, я хочу быть нечувствительным к порядку. –

1

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

Мое предложение было бы пойти с Split как предложил Хабиб, но если вы хотите, чтобы исправить регулярное выражение, то:

  • Сделать первую группу non-greedy (lazy): (.*?)
  • Фикс порядок ваших полей, и избегайте |, как предложено nhahtdh, или:
  • Если поля могут выйти из строя, вам может потребоваться повторить их, чтобы принять ноль, один или несколько (не лучшее задание для регулярного выражения, но выполнимое):

    (
        (termination=(...)|interval=(...)|days=(...)) 
        (\| (termination=(...)|interval=(...)|days=(...)))* 
    )? 
    

    (пробелы и символы новой строки добавлены для читаемости)

+0

Это именно то, что я испытываю. Тонны пустых массивов, я думаю, в моей мысли есть некоторая ошибка. Другим примером, который я хочу получить, является обработка параметров программы при вызове моей кли-программы (например, start.exe/help/param1 5/param2 "hello") –

+1

@GiehlMan Хотя хорошо иметь хорошее представление регулярных выражений , Я склонен использовать их только тогда, когда более простые альтернативы отсутствуют. Для анализа аргументов командной строки предпочтительный подход AFAIK использует ['OptionSet'] (http://stackoverflow.com/q/491595/520779). Но если вам нужно учиться, проверьте мои комментарии и ссылку выше о жадных против ленивых квантификаторов, а также вас могут заинтересовать [не захватывающие группы] (http://stackoverflow.com/q/3512471/520779) (чтобы сделать ваши результаты более чистыми). Использование '^' и '$' для принудительного полного соответствия строк также полезно. – mgibsonbr

Смежные вопросы