[^a-z]
Соответствует символу, который не находится в диапазоне a-z
. В вашей попытке вы добавили группу чередования внутри класса символов, но она просто не работает. Вместо этого, вы должны использовать отрицательное lookaround утверждение (предполагая, рубин поддерживает эти):
/^888(?!(44[47]|405)).*$/
Чтобы разорвать этот вниз:
^ # Anchor to start of string
888 # Match 888
(?! # Negative lookahead
( # Alternation group
44[47] # Match 444 or 447
| # ...or...
405 # 405
)
)
.* # Match any number of any characters
$ # Anchor to end of string
Обратите внимание, что та часть, которая говорит: «Матч любое количество любых символов» будут ограничены негативным прогнозом, так что 444, 447 и 405 будут соответствовать , а не, согласно вашим требованиям.
Таким образом, это будет соответствовать 888123
, 888 foo bar
, но не позволит 888444
или 888447
и т.д.
EDIT Чтобы соответствовать требованию появляться в любом месте в пределах строки:
/888(?!.*4(4[47]|05)).*/
т. Е. Соответствует любому 888, за которым следует что-либо (включая ничего), кроме 444, 447 или 405.
Предположим, что строки имеют произвольную длину, а шаблоны, которые мы сопоставляем, могут появляться в любом месте в названии. – Crashalot