Regex для проверки количества элементов с разделителями трубы - PullRequest
2 голосов
/ 14 декабря 2009

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

Если максимальное количество элементов равно трем:

asdfasdf | asdfasdf | asdfasdf = VALID

asdfasdf | asdfasdf | asdfasdf | asdfasf = Недействительно

Кроме того, эта строка может быть пустой.

Любая помощь будет высоко ценится

Привет

Ответы [ 6 ]

7 голосов
/ 14 декабря 2009
^(?:[^|]+(?:\|[^|]+){0,2})?$

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

Если вы хотите изменить верхний предел разрешенного количества элементов, измените {0,2} на {0,max-1}, где max - это желаемый предел (потому что в вашей строке будет не более max - 1 труб для того, чтобы быть действительным).

3 голосов
/ 14 декабря 2009

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

PHP:

$items = explode('|', $mystr);
if ($items > $max) failed

Python:

items = mystr.split('|')
if len(items) > max: failed
1 голос
/ 14 декабря 2009

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

0 голосов
/ 14 декабря 2009
^([^|]*\|){0,2}[^|]*$

Позволяет пустым строковым элементам, до трех элементов, изменять 0 или 2 для изменения минимального / максимального диапазона.

0 голосов
/ 14 декабря 2009
^[^|]*(?:\|[^|]*){0,2}$

Предполагается, что элементы между трубами могут быть пустыми.

0 голосов
/ 14 декабря 2009

Вероятно, здесь проще всего просто подсчитать | символов. Е. г. в PowerShell:

PS> $valid = 'asdfasdf|asdfasdf|asdfasdf'
PS> $notvalid= 'asdfasdf|asdfasdf|asdfasdf|asdfasf'
PS> ($valid.ToCharArray() | where {$_ -eq '|' }).Count -lt 3
True
PS> ($notvalid.ToCharArray() | where {$_ -eq '|' }).Count -lt 3
False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...