2012-07-11 2 views
9

Я пытаюсь найти регулярное выражение, которое соответствует строке, только если строка не заканчивается как минимум тремя «0» или более. Интуитивно я пробовал:Regex соответствует строке, не заканчивающейся шаблоном

.*[^0]{3,}$ 

Но это не совпадает, если в конце строки находится один или два нулей.

ответ

7

Вы можете попробовать использовать отрицательный внешний вид-сзади, то есть:

(?<!000)$ 

тесты:

Test Target String Matches 
1  654153640  Yes 
2  5646549800  Yes 
3  848461158000 No 
4  84681840000  No 
5  35450008748  Yes 

Пожалуйста, имейте в виду, что негативные просмотровых задом не поддерживаются на любом языке, однако ,

+0

Это не будет работать в каждой реализации. Например, он не будет работать в Javascript. Что вы делали? –

+0

Несомненно, что ему нужны тесты. Однако это решение работает хорошо и адаптировано к языку, не указанному op. – hsz

+0

Какую реализацию вы пробовали? Глядя на профиль OP, он, похоже, много использует bash, который не поддерживает lookbehinds, поэтому это не сработает и не может быть адаптировано. –

1

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

.*[^0]..$|.*.[^0].$|.*..[^0]$ 

, который упрощает для

.*([^0]|[^0].|[^0]..)$ 

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

.*[^0].{0,2}$ 
13

Если вы должны сделать это без утверждений (просмотром назад я е в JavaScript..):

^(?:.{0,2}|.*(?!000).{3})$ 

В противном случае, используйте ответ HSZ в.

Объяснение:

^   # Start of string 
(?:  # Either match... 
.{0,2} # a string of up to two characters 
|   # or 
.*  # any string 
(?!000) # (unless followed by three zeroes) 
.{3}  # followed by three characters 
)   # End of alternation 
$   # End of string 
2

Что случилось с не-смотреть-за, более общего назначения ^(.(?!.*0{3,}$))*$?

Общая картина ^(.(?!.* + not-ending-with-pattern + $))*$. Вам не нужно перерабатывать машину состояния, как это делает ответ Тима; вы просто вставляете шаблон, который вы не хотите сопоставлять в конце.

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