2012-03-21 4 views
2

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

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

Не подходит тире приемлемого образца? Я бы так предположил, учитывая, что моя фамилия не содержит тире. – dlev

+0

** Это не * тире ***; это U + 002D, символ HYPHEN-MINUS! Не забывайте U + 2010 HYPHEN, U + 2011 НЕРАСПРОСТРАНЯЮЩИЙ HYPHEN, U + 2012 РИСУНОК DASH, U + 2013 EN DASH, U + 2014 EM DASH, U + 2015 ГОРИЗОНТАЛЬНЫЙ БАР, U + 2053 SWUNG DASH, U + 207B SUPERSCRIPT MINUS, U + 208B SUBSCRIPT MINUS, U + 2212 MINUS SIGN, U + 2E3A TWO-EM DASH и U + 2E3B THREE-EM DASH - просто чтобы назвать несколько. Их больше. – tchrist

ответ

0

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

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

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

+0

точно вправо. Спасибо, что вы ответили –

0

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

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

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

2

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

  • начала струны: `^
  • по крайней мере, один не-тир: [^-]+
  • следует одна тира: -
  • следует, по крайней мере, один не тир: [^-]+
  • следует конец строки: $

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

+0

Я не думаю, что это правильно; OP явно заявляет, что тире не может быть в конце строки. – dlev

+0

Вы показали мне секрет, чтобы выяснить, как преобразовать строковые запросы в регулярное выражение. * Поклонения * –

+0

@diev Извините, неправильно прочитал - я думал, что это было только то, что это не могло быть в начале. Будет редактировать. Перри Моншау, рад помочь! :) – yshavit

2

Почему бы не просто использовать 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"); 

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

+0

Поскольку регулярное выражение намного эффективнее. –

+0

@PerryMonschau Хотя это может быть правдой, в этом случае строки могут быть довольно короткими, поэтому выигрыш в производительности, если таковой будет, будет минимальным. Кроме того, этот код является более понятным в отношении требований, чем регулярное выражение (как иллюстрируется многочисленными (а иногда и неправильными) регулярными выражениями, уже высказанными.) – dlev

0

Попробуйте рисунок примерно как [a-z] - [a-z].

Паттерн p = Образец.compile ("[a-z] - [a-z]");

+0

Проверьте свой регек на http://regexpal.com /. – Shailesh

Смежные вопросы