C # Regex.IsMatch возвращает истину, когда это не должно? - PullRequest
3 голосов
/ 10 января 2011

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

([0-9.])*

Вот код C # для проверки регулярного выражения:

Regex regex = new Regex("([0-9.])*");

if (!regex.IsMatch("a"))
    throw new Exception("No match.");

Я ожидаю, что здесь будет сгенерировано исключение, но это не так - я использую Regex неправильно или в шаблоне есть ошибка?

РЕДАКТИРОВАТЬ: Я также хотел бы сопоставить пустую строку.

Ответы [ 3 ]

11 голосов
/ 10 января 2011

Квантор * означает «соответствует 0 или больше». В вашем случае «a» возвращает 0 совпадений, поэтому регулярное выражение все еще успешно. Вы, вероятно, хотели:

([0-9.]+)

Квантор + означает «совпадение 1 или более», поэтому он не работает на нечисловых входах и не возвращает совпадений. Быстрый тест регулярное выражение показывает:

input      result
-----      ------
[empty]    No matches
a          No matches
.          1 match: "."
20.15      1 match: "20.15"
1          1 match: "1"
1.1.1      1 match: "1.1.1"
20.        1 match: "20."

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

^([0-9]+(?:\.[0-9]+)?)$

Теперь мы получаем:

input      result
-----      ------
[empty]    No matches
a          No matches
.          No matches
20.15      1 match: "20.15"
1          1 match: "1"
1.1.1      No matches: "1.1.1"
20.        No matches

прохлады.

8 голосов
/ 10 января 2011
Regex.IsMatch("a", "([0-9.])*") // true

Это потому, что группа может соответствовать НУЛЬ или более раз.

Regex.IsMatch("a", "([0-9.])+") // false
8 голосов
/ 10 января 2011

Вы должны использовать + вместо *

Regex reg = new Regex("([0-9.])+");

Это должно работать нормально.

Когда вы используете *, любая строка может соответствовать этому шаблону в вашем случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...