2012-04-27 3 views
2

Как сделать 'test2' необязательным элементом в следующем выражении C# RegEx, получив значение 'test1', правильно разобрался, когда элемент 'test2' отсутствует?Необязательный элемент в выражении соответствия C# RegEx

StringBuilder sb = new StringBuilder(); 
sb.AppendLine(" test1=123 any text in between "); 
sb.AppendLine(" some "); 
sb.AppendLine(" more "); 
sb.AppendLine(" text in between "); 
sb.AppendLine(" test2=456 "); 
sb.AppendLine(" test1=789 some text .. test2=012 "); 

Regex regex = new Regex(@"test1=(?<test1>(\d+))((.|\s)+?)(test2=(?<test2>(\d+)))"); 

MatchCollection matches = regex.Matches(sb.ToString()); 
foreach (Match match in matches) 
{ 
    Group test1 = match.Groups["test1"]; 
    Group test2 = match.Groups["test2"];     
    System.Console.WriteLine("Test1 = {0}, Test2 = {1}", test1.Value, test2.Value); 
} 

спасибо.


@Oded - отвечаю я здесь, как я не могу комментировать отформатирован должным образом, и, как мой ответ больше, чем дозволено StackOverflow длина текста комментария:


Спасибо. Предлагаемый во втором ответе результат выражения RegEx приводит к следующему выводу:

Test1 = 123, Test2 = 
Test1 = 789, Test2 = 

Это не совсем правильно. И ваш первый ответ результат выражения RegEx в

Test1 = 123, Test2 = 456 
Test1 = 789, Test2 = 012 

тест выхода. Это правильно.

Но если я изменю

sb.AppendLine(" test1=789 some text .. test2=012 "); 

в

sb.AppendLine(" test1=789 some text .. test52=012 "); 

тогда выходной результат теста будет только одна линия

Test1 = 123, Test2 = 456 

, и я хотел, чтобы это было

Test1 = 123, Test2 = 456 
Test1 = 789, Test2 = 

в этом случае.

ответ

1

Добавить? после того, как элемент, который вы хотите быть факультативным

.|\s можно заменить . начиная . матчей пробельные а

Чтобы соответствовать новой строки, а вы должны пройти опцию SingleLine Regex regex = new Regex(@"test1=(?<test1>(\d+))((.)+?)(test2=(?<test2>(\d+)))?",RegexOptions.Singleline);

(Решение по Одед является все это)

+0

спасибо. Пожалуйста, см. Мой комментарий выше. – ShamilS

+0

Я использую (. | \ S), чтобы иметь любые символы, а также новую строку (символы) пропущен -. один, кажется, недостаточно хорош. – ShamilS

+0

@ShamilS: Если вы хотите, чтобы класс '.' соответствовал символам новой строки, включите опцию« DOTALL »вашего регулярного выражения. (В Python это 're.DOTALL', в Perl это опция' s'. Посмотрите, что это такое на C#.) –

5

оговориться, что вся test2 группа является необязательной:

@"test1=(?<test1>(\d+))((.|\s)+?)(test2=(?<test2>(\d+)))?" 

Из MSDN - Regular Expression Language - Quick Reference:

? - Соответствует предыдущему элементу ноль или один раз.

+0

Спасибо. Поскольку мой тестовый прогон показывает здесь, если я добавлю знак вопроса в свой регюй RegEx, как вы предложили, элемент «test1» также будет отсутствовать, если «test2» отсутствует – ShamilS

+0

@ShamilS - Извините, я не применил '?'. – Oded

+0

@ShamilS - Я не могу это прочитать. Возможно, отредактируйте свой вопрос и добавьте его туда – Oded

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