.NET Regex isMatch vs Matches вопрос - PullRequest
3 голосов
/ 18 ноября 2009

да, это другой .net regex question :) (прошу прощения за длинную вафлю, ведущую к актуальному вопросу)

Я разрешаю пользователям использовать простые макросы даты / времени для быстрого ввода дат (им не нужен инструмент выбора даты)

например, они могут ввести:
d +1d -2h
это даст им строку даты и времени сегодняшней даты, плюс один день, минус два часа.

В любом случае я создал регулярное выражение, чтобы соответствовать им, и это прекрасно работает (вероятно, не лучший способ сделать это, но это работает!):
\b[DTdt]( *[+-] *[1-9][0-9]* *[dDhHmMwW])*\b

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

Regex rgxDateTimeMacro = new Regex(@"\b[DTdt]( *[+-] *[1-9][0-9]* *[dDhHmMwW])*\b");

if(rgxDateTimeMacro.isMatch(strInput)){
  ...string passes...
}

Затем я быстро понял, что isMatch возвращает true, если в переданной строке есть любые совпадения,
d +1d +1
вернул бы истину ^ __ ^

поэтому я изменил его, чтобы сделать что-то вроде этого:

Regex rgxDateTimeMacro = new Regex(@"\b[DTdt]( *[+-] *[1-9][0-9]* *[dDhHmMwW])*\b");
MatchCollection objMatches = rgxDateTimeMacro.Matches(strInput);

if (objMatches.Count > 0)
{
    // to pass.. we need a match which is the same length as the input string...
    foreach (Match m in objMatches)
    {
        if (m.Length == strInput.Length)
        {
            ...string passes...
        }
    }
}

теперь это работает нормально, но у меня такой вопрос: есть ли более простой способ проверить, соответствует ли строка (строка целом ) регулярному выражению? У меня был гугл, но я не могу найти очевидного ответа.

надеюсь, что это имеет смысл

Пит


UPDATE

спасибо за все быстрые ответы, ^ $ добивается цели:)

(показывая мою неопытность с регулярными выражениями ^ __ ^)

Ответы [ 5 ]

10 голосов
/ 18 ноября 2009

Если я правильно понимаю, используйте: ^my regex$

^ - начало строки
$ - конец строки

3 голосов
/ 18 ноября 2009

Напишите лучший шаблон, который соответствует только тому, что вы действительно хотите соответствовать! ;)

Мое предложение;

^[DTdt](\s+[+-]\s+[1-9][0-9]*[dDhHmMwW])+$

Краткое объяснение, чтобы показать различия;

1: ^                  beginning of string
2: [DTdt]             matches 1 character of the given
3:  (                 open group 1
4:   \s+              one or more whitespaces
5:   [+-]             either + or -
6:   \s+              see above
7:   [1-9][0-9]*      matches one number of 9 followed by none or more numbers of 10
8:   [dDhHmMwW]       one of the characters
9:  )                 close group 1
10: +                 let group 1 only repeat 1 or more times
11: $                 end of string

Надеюсь, вы видите отличия от вашего паттерна.

Соответствует: D +19d, t -99w +14d, T +75m -64H, D -1d +4m -44h

Нет совпадений: d, d +1, T +1H -2, +1D -5M, -134d, t-4m, t +5d5, D -3m-5d+3g

1 голос
/ 18 ноября 2009

В регулярных выражениях вы можете использовать символы ^ и $, чтобы указать, что выражение должно соответствовать всей тестовой строке:

  • ^, поскольку самый первый символ означает «Совпадение с начала моей тестовой строки».
  • $, поскольку самый последний символ означает «Соответствие концу моей тестовой строки».

В совокупности (например, ^abc$) вся строка теста должна соответствовать выражению.

0 голосов
/ 18 ноября 2009

использование: \Abla\Z

  1. \A Начало предмета.
  2. \Z Конец темы.

или используйте: ^bla$ с включенным многострочным режимом.

  1. ^ Начало строки.
  2. $ Конец строки.
0 голосов
/ 18 ноября 2009

Используйте это RegEx:

"^\b[DTdt]( *[+-] *[1-9][0-9]* *[dDhHmMwW])*\b$"

Символ ^ соответствует началу строки, а $ означает конец строки.

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