#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 *»