Почему регулярное выражение пытается создать подчиненное соответствие?

#c# #regex

#c# #регулярное выражение

Вопрос:

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

 <any number of spaces><one or more of alphanumeric character>;<any number of possible spaces>
 

Если мой ввод имеет указанное выше выражение, я возвращаю совпадения.

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

 s*w s*?;s*
 

Когда я делаю

 Regex.IsMatch(input, pattern, RegexOptions.IgnoreCase)
 

даже если у меня есть допустимый ввод, например "a;" , или " a;" я в конечном итоге получаю false.

Когда я проверяю с помощью инструмента регулярных выражений, кажется, что он соответствует всему, а затем он снова пытается найти субсогласование с second s *, и в этот момент он говорит, что нет субсогласования. Кто-нибудь может объяснить, почему я получаю false?

Комментарии:

1. Console.WriteLine(Regex.IsMatch("a;", @"s*w s*?;s*", RegexOptions.IgnoreCase)); возвращает true для меня. Хотя я бы использовал ^s*w s*;s*$ регулярное выражение.

2. Я получаю тот же результат, что и @Ulug. Вы уверены, что pattern это значение равно? s*w s*?;s* Возможно, оно неправильно экранировано.

Ответ №1:

Следующее будет просто работать в соответствии с вашими потребностями.

 s*w ;s*
 

Пример:

 Console.WriteLine(Regex.IsMatch("a;",    @"s*w ;s*"));  // True
Console.WriteLine(Regex.IsMatch("   a;", @"s*w ;s*"));  // True
Console.WriteLine(Regex.IsMatch("a;   ", @"s*w ;s*"));  // True
 

Комментарии:

1. Это работает. Спасибо. Просто любопытно, почему s *w s *?;s * выполнял подстановку и не работал.

2. @ArunavDev вопросительный знак вызывает проблему. Знак вопроса, следующий за *, делает совпадение ленивым, и я предполагаю, что оно компилируется неправильно.

3. @ArunavDev возможно, у вас был пробел в вашем шаблоне, он тоже работает. Смотрите здесь

4. Странно, у меня это не работает. Однако я использую .NET 4.5.1. Может ли это быть проблемой? Я подумал? * выполняет отложенный поиск.

5. Вы имеете в виду *? не ?*

Ответ №2:

Проблема заключается в среднем термине: » s *?». Вы должны читать регулярное выражение в группах, поэтому у вас есть (все пробелы должны обозначать группы, а не часть регулярного выражения): s * w s *? ; s*

Что это будет делать с: s *?

У вас должен быть s *w ;s * и это должно сработать.

Комментарии:

1. Спасибо tradetree. s *w ;s * работает. s * w s *?; s * тоже должно было сработать (я думаю, w также заботится о символе пробела?) Я пробовал использовать круглые скобки для группировки с помощью s *w s *?;s *, это не сработало.

2. Я вижу другие ответы, которые думают s *? должно сработать, но я бы никогда этого не сделал, поскольку я не знаю, каким будет определение для «*?». Вместо этого другим разумным ответом является » s * w s *; s *»