Один образ мыслей об этом - это:
O (N^2) означает для каждого элемента, Вы делаете что-то с любым элементом, таким как сравнение их. Пузырьковая сортировка является примером этого.
O (N регистрируют N) средства для каждого элемента, Вы делаете что-то, что только должно посмотреть на журнал N элементов. Это обычно, потому что Вы знаете что-то об элементах, которые позволяют Вам сделать эффективный выбор. Большинство эффективных видов является примером этого, таким как сортировка слиянием.
O (N!) означает делать что-то для всех возможных перестановок элементов N. Коммивояжер является примером этого, где существуют N! способы посетить узлы и решение для грубой силы состоят в том, чтобы посмотреть на общую стоимость каждой возможной перестановки для нахождения оптимальной.
Я заметил, что яблочный сок
должен соответствовать по вашим параметрам, а как насчет яблочного сока
? Я предполагаю, что если вы проверяете яблочный сок
, вы все равно хотите, чтобы он потерпел неудачу.
Итак, давайте создадим набор символов, которые считаются «границей»:
/[^-a-z0-9A-Z_]/ // Will match any character that is <NOT> - _ or
// between a-z 0-9 A-Z
/(?:^|[^-a-z0-9A-Z_])/ // Matches the beginning of the string, or one of those
// non-word characters.
/(?:[^-a-z0-9A-Z_]|$)/ // Matches a non-word or the end of string
/(?:^|[^-a-z0-9A-Z_])(apple|orange|juice)(?:[^-a-z0-9A-Z_]|$)/
// This should >match< apple/orange/juice ONLY when not preceded/followed by another
// 'non-word' character just negate the result of the test to obtain your desired
// result.
В большинстве разновидностей регулярных выражений \ b
считается «границей слова», но стандартный список «символов слов» не включает -
, поэтому вам нужно создать собственный. Он мог бы соответствовать / \ b (яблоко | апельсин | сок) \ b /
, если бы вы также не пытались поймать -
...
Если вы только Тестирование однословных тестов вы можете выполнить гораздо проще:
/^(apple|orange|juice)$/ // and take the negation of this...
\A(?!apple\Z|juice\Z|orange\Z).*\Z
будет соответствовать всей строке, если она не состоит только из одного из запрещенных слов.
В качестве альтернативы, если вы не используете Ruby или уверены, что ваши строки не содержат разрывов строки или вы установили параметр, при котором ^
и $
не совпадают в начале / конце строк
^(?!apple$|juice$|orange$).*$
, также будет работать.
Если вы действительно хотите сделать это с помощью одного регулярного выражения, вы можете найти полезным поиск (особенно отрицательный просмотр вперед в этом примере). Регулярное выражение, написанное для Ruby (некоторые реализации имеют другой синтаксис для поиска):
rx = /^(?!apple$|orange$|juice$)/
Что-то вроде (PHP)
$input = "The orange apple gave juice";
if(preg_match("your regex for validating") && !preg_match("/apple|orange|juice/", $input))
{
// it's ok;
}
else
{
//throw validation error
}
Это немного похоже на путь:
((?:apple|orange|juice)\S)|(\S(?:apple|orange|juice))|(\S(?:apple|orange|juice)\S)