2013-09-03 5 views
1

Помогите с регулярным выражением. Я работаю над проверкой строки. Значение не должно содержать только%, а если есть%, длина должна быть более 3 символов, включая%. % может быть где угодно в строке (точка включена).Регулярное выражение: проверка ключа поиска

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

@"^[a-zA-Z0-9'.]*%"; //{3,}$";

Спасибо, Нэвин

Примеры:

  • "%" - Сбой
  • "%12" - Сбой
  • "%123" - Передайте
  • "%1234" - Передайте
  • "12%3" - Передайте
  • "abc%" - Передайте
  • "abc" - Передайте
  • "A" - Передайте
  • "ABC" - Передайте
+0

Проверка строки, если она содержит%, если да, то длина строки должна быть больше 3. –

+1

Рекомендуем использовать http://www.regexplained.co.uk/ для проверки регулярного выражения. –

+0

Как насчет «%%%%» - пройти или провалиться? – Mike

ответ

3

Я не думаю, что это нужно Regex решить, только некоторые строки методы в порядке:

var valid = !input.Contains("%") || input.Length > 3; 

Если вы хотите использовать Regex, здесь вы:

^([^%]+|.{4,})$ 
+0

Да, истина, другие проверки выполняются с использованием атрибута регулярного выражения, поэтому попытка быть последовательной. –

+2

Да, но лучше использовать правильный инструмент для задания, чем использовать неправильный инструмент и быть последовательным. –

+0

Спасибо @King –

6

Если это степень вашей проверки, вы бы лучше использовать Contains("%") и Length свойство string.

return !value.Contains("%") || value.Length > 3; 

Это по своей сути трудно с одним регулярным выражением для проверки как общей длины и для шаблона внутри. Если % находились в фиксированном месте (начало, конец, 2-й символ с начала и т. Д.), Он бы соответствовал лучше, но как есть, это не проблема, которая должна быть решена изящно с одним RegEx.

Это может быть сделано с уродливым RegEx, используя некоторые образы, но это решение вряд ли будет переносимым в разных реализациях RegEx (например, вероятно, оно не будет работать с проверкой Javascript на стороне клиента).

1

Попробуйте следующее выражение в C#:

@"^((?=(?>.*?[^%]){3,}).*|[^%]+)$" 

Это соответствует, как описано в ваших примерах:

  • "%" - Сбой
  • "%12" - Сбой
  • "%123" - Передайте
  • "%1234" - Проход
  • "12%3" - Передайте
  • "abc%" - Передайте
  • "abc" - Передайте
  • "A" - Передайте
  • "ABC" - Передайте

использовать не захват, ноны атомной группы в том же выражении для него для работы в javascript (адреса Jay's issue):

@"^((?=(?:.*?[^%]){3,}).*|[^%]+)$" 
+0

@ Джей Красота в глазах смотрителя;) – JonM

1

В предположении, что по крайней мере один символ необходим для проверки -

^(?:[^%]+|.*[^%].*[^%].*[^%].*)$ 

То же JonM (не знаю, как удалить это, хотя).

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