регулярное выражение, чтобы разрешить только 1 тире - PullRequest
2 голосов
/ 21 марта 2012

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

          Pattern p = Pattern.compile("[^a-z-']", Pattern.CASE_INSENSITIVE);
          Matcher m = p.matcher(name);

Ответы [ 5 ]

2 голосов
/ 21 марта 2012

Почему бы просто не использовать indexOf() в String?

String s = "last-name";
int first = s.indexOf('-');
int last = s.lastIndexOf('-');

if(first == 0 || last == s.length()-1) // Checks if a dash is at the beginning or end
    System.out.println("BAD");
if(first != last) // Checks if there is more than one dash
    System.out.println("BAD");

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

2 голосов
/ 21 марта 2012

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

  • начало строки: `^
  • хотя бы один не-тире: [^-]+
  • с последующим тире: -
  • с последующим хотя бы одним не-тире: [^-]+
  • с последующим концом строки: $

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

0 голосов
/ 21 марта 2012

Попробуйте шаблон что-то вроде [a-z] - [a-z] .

Pattern p = Pattern.compile ("[a-z] - [a-z] ");

0 голосов
/ 21 марта 2012

Похоже, что ваше регулярное выражение представляет фрагмент значения недопустимого , и вы, вероятно, используете Matcher.find(), чтобы определить, соответствует ли любая часть вашего значения этому регулярному выражению. Это верно? Если это так, вы можете изменить свой шаблон на:

Pattern p = Pattern.compile("[^a-zA-Z'-]|-.*-|^-|-$");

, который будет соответствовать символу без буквы, без дефиса и без апострофа, или последовательность символов, которые начинаются и заканчиваются дефисами (таким образом обнаруживая значение, содержащее два дефиса), или ведущий дефис, или конечный дефис.

0 голосов
/ 21 марта 2012

Это регулярное выражение представляет один или несколько без дефисов , за которыми следует один дефис, за которым следует один или несколько без дефисов .

^[^\-]+\-[^\-]+$

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

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