Соответствует ли регулярное выражение a * всем строкам?

#c# #.net #regex

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

Вопрос:

У меня есть следующий код:

 string rex = "a*";
string txt = "cvb";
Regex regex = new Regex(rex);
Console.WriteLine("Success:"   regex.IsMatch(txt));
  

Этот код всегда возвращает true.
Я думал, что шаблон a * будет соответствовать ТОЛЬКО: «», «a», «aa», «aaa ….».

Я протестировал эту ситуацию здесь.

И тот же пример не соответствовал.

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

1. На тестовом сайте, на который вы ссылались, это показывает, что find () будет работать для этой комбинации.

Ответ №1:

Это имело бы место только для ^a*$ . Поскольку вы не используете привязки начала и конца, оно всегда будет соответствовать «nothing» в любой строке.

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

1. якоря ^ и $ важны, но более важным для вопроса является различие между * и , которое вы, похоже, полностью упустили.

2. За исключением того, что он хочет, чтобы оно соответствовало «», поэтому это неуместно.

3. @Spudley, я думаю, что ты что-то пропустил, OP хочет также сопоставить пустую строку. Он просто не знал, IsMatch что возвращает частичные совпадения.

4. хм, да; возможно, вы правы. 🙂 (думаю, это легко пропустить; я думаю, я ожидал a решения, потому что это было бы более распространенным требованием)

Ответ №2:

Если вы внимательнее посмотрите на результаты RegexPlanet, вы увидите, что, хотя matches() метод завершается с ошибкой, оба find() метода lookingAt() возвращают true значение и и, и и. matches() неявно закрепляет соответствие на обоих концах, как если бы вы написали ^a*$ . lookingAt() автоматически закрепляет совпадение только в начале, а find() вообще его не закрепляет.

Конечно, это все методы Java, которые являются разновидностью регулярных выражений, используемых RegexPlanet. IsMatch() Метод .NET эквивалентен методу Java find() , и у него нет эквивалента для matches() or lookingAt() (и они не нужны). Если вы хотите, чтобы совпадение было закреплено, вы должны закрепить его самостоятельно.

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

1. Ах. Да. Это дает » 1: Проницательный». Это очень хорошо объясняет, как в первую очередь возникла путаница в операционной системе.

Ответ №3:

Звездочка в регулярном выражении указывает на ноль или более вхождений предыдущего элемента «.

В этом случае предшествующим элементом является символ «a», и больше в регулярном выражении ничего нет.

Следовательно, это регулярное выражение содержит «ноль или более символов ‘a'».

Поскольку вы заявляете, что ожидаете сопоставления ‘a’, ‘aa’ или ‘aaa’ с вашим a* , то вместо звезды вы, вероятно, хотите знак плюс. Это означало бы «один или несколько предыдущих элементов».

[ПРАВИТЬ]

Как говорит @Bindy, если вы хотите сопоставить пустую строку, а также любое количество букв «а» (пункт, который я пропустил), то для этого вам также нужно будет сопоставить.

В этом случае решение @Bindy сработало бы.

Альтернативно, решение, использующее a , выглядело бы следующим образом:

 (a |^$)
  

это будет соответствовать либо одной, либо нескольким буквам ‘a’, либо пустой строке. Обратите внимание, что это отличается от решения @Bindy тем, что его решение соответствует только тому, где строка содержит только ‘a’ и ничего больше, тогда как мое будет соответствовать любой строке, содержащей одну или более ‘a ‘, или пустой строке.

Ваши примеры на самом деле не охватывают, какой из них был бы тем, что вы хотите (я подозреваю, что вы добавили что-то более близкое к ответу @ Bindy, чем это, но я чувствовал, что все равно должен добавить это здесь)

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

1. Спасибо за объяснение. Чего я не понимаю, так это почему разные реализации регулярных выражений выдают разные результаты.

2. @gonzalog, чем отличается? Что-то такое простое будет согласовано практически во всех современных реализациях регулярных выражений.

3. @gonzalog — Я думаю, что ответ @Alan Moore довольно хорошо объясняет ответ на этот вопрос.

Ответ №4:

a * сообщает интерпретатору регулярных выражений, чтобы оно соответствовало 0 множеству раз. Я полагаю, что вы хотите a.* , или если вы хотите, чтобы оно влияло на всю строку и совпадало только в том случае, если первый символ равен a, тогда $a.*^

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

1. Я так понимаю, это на самом деле: ^a$ . И в любом случае знак больше напоминает * , чем . .

Ответ №5:

Попробуйте использовать следующий

 ^a*$
  

Кажется, работает