Необязательные символы в регулярном выражении - PullRequest
6 голосов
/ 19 мая 2009

Задача довольно проста, но я пока не смог найти хорошее решение: строка может содержать цифры, тире и плюсы или только цифры.

^[0-9+-]+$

делает большую часть того, что мне нужно, кроме случаев, когда пользователь вводит мусор, как "+ - + - +"

Мне не повезло с обычным прогнозом, так как черты и плюсы потенциально могут быть где угодно в строке.

Допустимые строки:

  1. 234654
  2. 24-3 + -2
  3. -234
  4. 25485 +

Invalid:

  1. ++ - +

Ответы [ 5 ]

15 голосов
/ 19 мая 2009

Как насчет этого:

([+-]?\d[+-]?)+

, что означает «одну или несколько цифр, каждой из которых может предшествовать или следовать необязательный плюс или минус».

Вот тестовый скрипт Python:

import re
TESTS = "234654 24-3+-2 -234 25485+ ++--+".split()
for test in TESTS:
    print test, ":", re.match(r'([+-]?\d[+-]?)+', test) is not None

который печатает это:

234654 : True
24-3+-2 : True
-234 : True
25485+ : True
++--+ : False
8 голосов
/ 19 мая 2009

Как насчет:

^[0-9+-]*[0-9][0-9+-]*$

Это гарантирует, что где-то в строке будет хотя бы одна цифра. (Похоже, однако, что он может иметь большой откат назад. Но с другой стороны у него нет + или *, заключенного в другой + или *, что мне тоже не нравится)

2 голосов
/ 19 мая 2009
^([+-]*[0-9]+[+-]*)+$

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

^[0-9+-]+$(?<=[0-9][+-]*)

Или используя положительное прогнозное утверждение.

(?=[+-]*[0-9])^[0-9+-]+
0 голосов
/ 25 апреля 2011

Я бы сделал это так:

^[-+]*\d[\d+-]*$

Быстро это хорошо!

0 голосов
/ 25 апреля 2011

Мне нравится

^(?=.*\d)[\d+-]+$ 

решение, я сам. Он говорит именно то, что вам нужно, без необходимости царапать голову.

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