Perl Regex Отрицательный взгляд за неправильным соответствием (SAS)

Из того, что я могу сказать, тег по умолчанию является единственным inline-block. Чтобы быть в безопасности, я бы порекомендовал класс, вы никогда не знаете, когда меняются все элементы определенного типа, чтобы укусить вас. Или вы всегда можете создать свой собственный тег и назначить ему display:inline-block;. Таким образом, вы не меняете стандартные функции стандартных элементов ...

EDIT

Также появляется button, textarea, input и select inline-block

Источники:

В соответствии с этим img есть inline-block http://dev.w3.org/html5/markup/ img.html # img-display

И здесь утверждается, что button, textarea и т. д. также: http://www.w3.org/TR /CSS2/sample.html

EDIT # 2

Хотя источник выше утверждает, что img теги inline-block кажется (благодаря Alohci), что они являются только inline http://jsfiddle.net/AQ2yp/

В Firefox были протестированы следующие:

button есть inline-block : http://jsfiddle.net/GLS4P/

textarea is inline: http://jsfiddle.net/235vc/

input is inline: http://jsfiddle.net/RFKe8/

select is inline-block: http://jsfiddle.net/5B4Gs/

1
задан Richard 5 March 2019 в 20:27
поделиться

1 ответ

Вот как ваше регулярное выражение соответствует no and little risk:

Одна из ветвей вашего регулярного выражения - ...|(?<!\bno)(?<!low).+risk.

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

no and little risk
^

Первое ограничение заключается в том, что текущей позиции не может предшествовать граница слова, за которой следует «нет» (из-за (?<!\bno)). Это условие выполняется: началу строки назначения ничего не предшествует.

Вторым ограничением является то, что текущей позиции не может предшествовать «низкий» (из-за (?<!low)). Это условие также выполняется (см. Выше).

Затем мы сопоставляем один или несколько не-новых символов, но как можно больше из них (это часть .+). Здесь мы первоначально потребляем всю строку:

no and little risk
------------------^

Но затем регулярное выражение требует совпадения risk, что не удается (в целевой строке больше не осталось символов). Это заставляет .+ возвращаться назад и потреблять все меньше и меньше символов, пока это не произойдет:

no and little risk
--------------^

На этом этапе risk успешно совпадает, и регулярное выражение заканчивается.

Основная проблема в том, что вы хотите сделать, это (?<!\bno.+)(?<!low.+)risk, но то, что вы написали, это (?<!\bno)(?<!low).+risk. Это две совершенно разные вещи!

Первая означает «соответствовать« риску », но только если ей не предшествуют« нет »или« низкий уровень »где-либо в строке (до 1 символа до« риска ») ». Последнее означает «соответствовать любой непустой подстроке, за которой следует« риск », если ей не предшествует ни« нет », ни« низкий »». Это дает механизму регулярных выражений свободу поиска любой подходящей позиции в строке, если ей не предшествует сразу «нет» или «низкий уровень» и где-то следует «. + Риск».

К сожалению, (?<!\bno.+) не является допустимым регулярным выражением, потому что контрольные утверждения должны иметь фиксированную длину.

Один из возможных обходных путей - сделать следующее:

^(?!.*(?:\bno|low).+risk).*risk

Это говорит: начиная с начала строки, сначала убедитесь, что нет «нет» или «низкий», а затем «риск» в любом месте, затем сопоставьте «риск» в любом месте строки.

Это не совсем эквивалентно (гипотетической) версии с изменяющейся шириной, потому что она соответствовала бы

risk no risk
^^^^

из-за присутствия «риска» без «нет», предшествующего ему. тогда как этот обходной путь сначала находит

risk no risk
     ^^^^^^^

и немедленно отклоняет всю строку.

0
ответ дан melpomene 5 March 2019 в 20:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: