Есть несколько подходов, которые вы можете использовать здесь, и я перечислю некоторые из них.
Проверка того, что для всех случаев требование всегда выполняется
В этом подходе мы простонайдите 0000(1111)?
и найдите все совпадения.Так как ?
является жадным, он будет соответствовать 1111
, если это возможно, поэтому мы просто проверяем, что каждое совпадение 00001111
.Если это только 0000
, то мы говорим, что ввод недействителен.Если мы не нашли ни одного совпадения, равного 0000
(возможно, из-за того, что вообще нет совпадения), мы говорим, что оно действительно.
В псевдокоде:
FUNCTION isValid(s:String) : boolean
FOR EVERY match /0000(1111)?/ FOUND ON s
IF match IS NOT "00001111" THEN
RETURN false
RETURN true
Проверка того, что есть случай, когда требование не выполнено (затем возражаем)
В этом подходе мы вместо этого используем регулярное выражение, чтобы попытаться найти нарушение. Таким образом, успешное совпадение означаетмы говорим, что ввод недействителен.Если нет совпадения, то нет и нарушения, поэтому мы говорим, что ввод действителен (это то, что подразумевается под «чек-то-против»).
В псевдокоде
isValid := NOT (/violationPattern/ FOUND ON s)
Опция Lookahead
Если ваш аромат поддерживает это, отрицательный прогноз является наиболее естественным способом выражения этого паттерна.Просто поищите 0000(?!1111)
.
Опция без предварительного просмотра
Если ваш аромат не поддерживает отрицательный прогноз, вы все равно можете использовать этот подход.Теперь шаблон становится 00001{0,3}(0|$)
.То есть мы пытаемся сопоставить 0000
, затем 1{0,3}
(то есть между 0-3 1
), затем либо 0
, либо конец привязки строки $
.
Полностью прописанный параметр
Это эквивалентно предыдущему параметру, но вместо использования синтаксиса повторения и чередования вы явно указываете, что является нарушениями.Это
00000|000010|0000110|00001110|
0000$|00001$|000011$|0000111$
Проверка того, что не существует случая, когда требование не выполнено
Это основано на отрицательном прогнозе;это просто перевод предыдущего подхода на следующий уровень.Вместо:
isValid := NOT (/violationPattern/ FOUND ON s)
мы можем ввести NOT
в регулярное выражение, используя отрицательный взгляд следующим образом:
isValid := (/^(?!.*violationPattern)/ FOUND ON s)
То есть, привязывая себя в начале строки, мыотрицательно утверждают, что мы можем соответствовать .*violationPattern
..*
позволяет нам "искать" violationPattern
настолько далеко вперед, насколько это необходимо.
Вложения
Вот образцы, показанные на рубулярной:
- Подход 1: Только совпадение
0000
означает недействительным - Подход 2: Совпадение означает недействительным
- Подход 3: Соответствие означает действительное
Используемые входные данные (аннотированы, чтобы показать, какие из нихдействительны):
+ 00101011000011111111001111010
- 000011110000
- 0000110
+ 11110
- 00000
- 00001
- 000011
- 0000111
+ 00001111
Ссылки