Регулярное выражение, которое будет анализировать 00.00 - PullRequest
6 голосов
/ 06 августа 2009

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

  • (пустой)
  • 0
  • 00
  • 00,0
  • 00,00

Я придумал ([0-9]){0,2}\.([0-9]){0,2}, который мне говорит: «цифры от 0 до 9, встречающиеся от 0 до 2 раз, за ​​которыми следует«. » символ (который должен быть необязательным), за которым следуют цифры от 0 до 9, встречающиеся от 0 до 2 раз. Если введены только 2 цифры, то «.» не нужно. Что не так с этим регулярным выражением?

Ответы [ 5 ]

15 голосов
/ 06 августа 2009

Вы не сделали точку необязательной:

[0-9]{0,2}(\.[0-9]{1,2})?
3 голосов
/ 06 августа 2009

Во-первых, {0-2} должно быть {0,2}, как это было в первом случае.

Во-вторых, вам также нужно сгруппировать повторяющиеся секции.

В-третьих, вам нужно сделать всю последнюю часть необязательной. Поскольку, если есть точка, после нее должно быть что-то, вы должны также изменить вторую вещь повторения на {1,2}.

([0-9]{0,2})(\.([0-9]{1,2}))?
2 голосов
/ 06 августа 2009

Есть несколько проблем с вашим регулярным выражением:

  1. Точка является специальным символом и действует как подстановочный знак; если вам нужна буквальная точка, вам нужно ее избежать (\.).
  2. Даже если вы заменили точку, чтобы она не была подстановочным знаком, ваше регулярное выражение будет соответствовать строкам типа «0». потому что вы не указали механизму регулярных выражений совпадать только с точкой, если за ней следуют числа.
  3. Поскольку ваше выражение не привязано , оно может совпадать со строками, которые содержат образец в другом слове, например (например, ab12 будет соответствовать).

Лучшим рисунком будет что-то вроде:

/\b[0-9]{0,2}(?:\.[0-9]{1,2})?\b/

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

1 голос
/ 06 августа 2009

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

use warnings;
use strict;

my @data = (
    '',
    '0',
    '00',
    '00.0',
    '00.00',
    'foo',    # Should not match.
    '.0',     # Should not match.
);

for (@data){
    print $_, "\n" if /^$|^[0-9]{1,2}(\.[0-9]{1,2})?$/;
}
0 голосов
/ 06 августа 2009

Большинство приведенных выше примеров не привязывают начало ^ и конец $ данных.

Я бы решил это одним из следующих способов:

  • ^[[:digit:]]{0,2}([.][[:digit:]]{1,2})$
  • ^\d{0,2}([.]\d{1,2})$
  • ^[0-9]{0,2}([.][0-9]{1,2})$

Для удобства чтения я обычно предпочитаю использовать [.] - \. и использовать классы POSIX, такие как [[:digit:]].

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