Как мне написать регулярное выражение, которое не будет соответствовать определенному количеству пробелов? - PullRequest
2 голосов
/ 11 октября 2011

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

У меня есть эти строки:

123      99999 # has 6 white spaces
321      99999 # same
123   8888    # has 3 white spaces  \
321   8888    # same                | - These are the lines I
1237777                             |   want to match
3217777                             /

Я хочу сопоставить последние четыре строки, т. Е. Начинается с 123 или 321, за которыми следуют все, кроме 6 пробельных символов:

^(123|321)[^\ ]{6}.*

Кажется, это не сработает - это соответствует только двум последним. Чего мне не хватает?

Ответы [ 4 ]

2 голосов
/ 11 октября 2011
"   888"

Если вы соответствуете этому, это не соответствует [^\ ]{6}: это говорит

[not a space][not a space][not a space][not a space][not a space][not a space]

В этом случае у вас проблема с тем, что первые 3 символа являются пробелом, поэтому они не совпадают.

Вы можете использовать негативный взгляд ^(123)|(321)(?!\s{6}). Что я предпочитаю, потому что это более читабельно, так это написать регулярное выражение, совпадающее с тем, что вам не нужно, а затем отрицать (т. Е. not, ! и т. Д.). Я недостаточно знаю о ваших данных, но я бы использовал \s{6}, а затем отрицал бы его.

1 голос
/ 11 октября 2011

На каком языке вы это делаете? Если в Perl или чем-то, что поддерживает PCRE, вы можете просто использовать отрицательное прогнозное утверждение:

^(123)|(321)(?!\ {6}).*
1 голос
/ 11 октября 2011

Попробуйте это:

^(123|321)(?!\s{6}).*

(используется отрицательный прогноз, поэтому посмотрите, есть ли 6 совпадений в .* совпадении)

0 голосов
/ 11 октября 2011

Вы должны сначала сказать, что он может иметь 3 пробела, а затем отрицать существование еще трех пробелов, например:

^([0-9]+)(\s{0,3})([^ ]{3})([0-9]*)$

^ ([0-9] +) = Принимает один илибольше цифр в начале вашей строки.

(\ s {0,3}) = Принимает ноль или до трех пробелов.

([^] {3}) = Запретитьследующие 3 пробела после разрешенных пробелов.

([0-9] *) = Принимает любое число после пробелов до конца вашей строки.

Или:

^([0-9]+)(\s{0,3})(?!\s+)([0-9]*)$

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

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

...