Регулярное выражение для соответствия name1.name2 [.name3] - PullRequest
1 голос
/ 18 сентября 2008

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

smith.jack or smith.jack.s

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

^([\S][^.]*[.]{1}[\S][^.]*|[\S][^.]*[.]{1}[\S][^.]*[.]{1}[\S][^.]*)$

соответствует "smith.jack" и "smith.jack.s", но также соответствует "smith..jack" "smith..jack.s"! Боже мой, ему даже нравится точка в качестве первого персонажа. Кажется, что было бы так просто кодировать, но это не так. Я использую .NET, кстати.

расстраивает.

Ответы [ 12 ]

6 голосов
/ 18 сентября 2008

что помогает?

/^[^\s\.]+(?:\.[^\s\.]+)*$/

или в расширенном формате с комментариями (в стиле ruby)

/
  ^           # start of line
  [^\s\.]+    # one or more non-space non-dot
  (?:         # non-capturing group
    \.        # dot something
    [^\s\.]+  # one or more non-space non-dot
  )*          # zero or more times
  $           # end of line
/x

вам не ясно, сколько раз у вас может быть точка-что-то, но вы можете заменить * на {1,3} или что-то, чтобы указать, сколько повторений разрешено.

Мне, вероятно, следует прояснить, что косые черты - это буквальный разделитель регулярных выражений в ruby ​​(и perl, js и т. Д.).

2 голосов
/ 18 сентября 2008

Я понимаю, что это уже решено, но нахожу Regexpal чрезвычайно полезным для создания прототипов регулярных выражений. На сайте есть множество простых объяснений основ и вы можете увидеть, что соответствует, когда вы настраиваете выражение.

2 голосов
/ 18 сентября 2008

Я не знаком с регулярными выражениями .NET. Это будет делать то, что вы хотите в Perl.

/^\w+\.\w+(?:\.\w+)?$/

Если .NET не поддерживает синтаксис без захвата (?:xxx), используйте вместо этого:

/^\w+\.\w+(\.\w+)?$/

Примечание: я предполагаю, что когда вы говорите «не пробел, не точка», вы действительно имеете в виду «символы слова».

2 голосов
/ 18 сентября 2008

^ ([^ \ s.] +) \ ([^ \ S.] +).? (?:. \ ([. ^ \ S] +)) $

2 голосов
/ 18 сентября 2008

Вы используете * дублирование, которое допускает 0 итераций данного компонента.

Вы должны использовать плюс и поставить финальный. [^.] + В группу, за которой следует? представлять возможность дополнительного набора.

Может не иметь идеального синтаксиса, но должно сработать что-то похожее на следующее.

^ [^. \ S] + [.] [^. \ S] + ([.] [^. \ S] +)? $

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

1 голос
/ 18 сентября 2008
[^\s.]+\.[^\s.]+(\.[^\s.]+)?

Кстати, то, что вы просили, позволяет "." и ".."

0 голосов
/ 18 сентября 2008

RegexBuddy Хороший (несвободный) инструмент для регулярных выражений

0 голосов
/ 18 сентября 2008

Я выбрал немного другой подход. Я подумал, что вы на самом деле просто хотели получить строку из непробельных символов, за которой следует только одна точка, но эта точка является необязательной (для последней записи). Тогда вы хотели, чтобы это повторилось.

^([^\s\.]+\.?)+$

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

^([^\s\.]+\.?){1,3}$

Надеюсь, это поможет.

0 голосов
/ 18 сентября 2008
^([^.\W]+)\.?([^.\W]+)\.?([^.\W]+)$

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

0 голосов
/ 18 сентября 2008
[^.\s]+\.[^.\s]+(\.([^\s.]+?)? 

имеет непревзойденный парень. Если исправлено до

[^.\s]+\.[^.\s]+(\.([^\s.]+?))?

все еще слишком либерален. Соответствует a.b. а также a.b.c.d. и .a.b
Если исправлено до

[^.\s]+\.[^.\s]+(\.([^\s.]+?)?)

не соответствует a.b

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