Я создал шаблон регулярного выражения для сопоставления последовательностей цифр, которые могут идти по возрастанию или убыванию, например 12345, 123, 321, 6789, 7654 и т. д. Однако я считаю, что этот подход может быть не самым эффективным или профессиональным способом достижения этой цели. задача.
Не могли бы вы предоставить более простое регулярное выражение, которое может соответствовать числовым последовательностям, как по возрастанию, так и по убыванию? Вот как я сейчас реализую это в Laravel
'sequential' => function ($query) {
$query->orWhereRaw('plate_number REGEXP ?', ['\\b(123(4(5)?)?|234(5)?|345|456|567(8(9)?)?|678(9)?|789|987(6(5)?)?|876(5)?|765|654|543(2(1)?)?|432(1)?)\\b']);
},
Я попробовал несколько подходов для создания шаблона регулярного выражения, который точно соответствует последовательностям чисел. Однако шаблон регулярного выражения, который я придумал, кажется мне непрофессиональным. Не могли бы вы проверить, правильно ли это, или предложить лучший способ добиться этой цели? На рекламных объявлениях будут указаны такие номера, как, например, 1234,2345, 5432,98765,... и т. д.
Следует ли допускать пропуски в восходящей последовательности? Должен ли 0246 совпадать?
0
нельзя?
Ваше регулярное выражение не соответствует ни одному из следующих значений: 4567
, 45678
, 345678
, 23456
, 123456
, 3456
, 123456
,... Есть ли еще какие-то правила?
да, это не идеально, но конкретных правил больше нет, просто последовательность чисел либо по возрастанию, либо по убыванию, но они должны быть в последовательности, просто
А как насчет 0
: это запрещено?
Пытаться:
^(?:(?<inc>1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)|8(?=9)){2,}.|(?<dec>9(?=8)|8(?=7)|7(?=6)|6(?=5)|5(?=4)|4(?=3)|3(?=2)|2(?=1)){2,}.)$
См.: regex101
Объяснение
^...$
: найти всю строку(?:...|...)
: соответствует возрастанию или убыванию
(?<inc>...)
: увеличение определяется как
1(?=2)|...
: число и просмотр вперед, гарантирующий, что за ним последует преемник{2,}.
: возьмите как минимум два таких числа и сопоставьте третье (которое с помощью предпросмотра гарантированно будет преемником)(?<dec>...
: сделайте то же самое, чтобы уменьшитьэто сработало ✌ Спасибо большое
Аналогично другому ответу, но заглядываем вперед с двумя цифрами вместо одной:
\b(?:(?:(?=12|23|34|45|56|67|78|89).){2,}|(?:(?=98|87|76|65|54|43|32|21).){2,}).\b
Таким образом, он смотрит вперед, гарантируя, что либо каждая пара является возрастающей парой, либо каждая пара является убывающей парой. После действительных пар должен быть перерыв.
Если вы хотите сопоставлять не подстроки, а только всю строку, используйте ^
и $
вместо \b
:
^(?:(?:(?=12|23|34|45|56|67|78|89).){2,}|(?:(?=98|87|76|65|54|43|32|21).){2,}).$
Примечание: очевидно, 0
не разрешено (поскольку его нет в вашем регулярном выражении), поэтому я исключил его и здесь. Если вы хотите разрешить ввод таких входных данных, как 012
, вам необходимо адаптировать регулярное выражение, чтобы оно также включало 01
и 10
в качестве допустимых пар.
Я создал шаблон регулярного выражения для сопоставления последовательностей цифр, которые могут идти по возрастанию или убыванию, например 12345, 123, 321, 6789, 7654 и т. д. Являются ли эти проверяемые значения полными значениями (т.е. других символов нет) ? это подстроки, которые можно найти в более сложном значении?