Есть ли способ выбрать самое короткое совпадение при чередовании?

Ну видимо проблема была в диапазоне ip... Я поменял 10.7.0.0 на 10.8.1.0 и все заработало почти сразу...

Странно, потому что у меня нет другой сети в этом диапазоне.

-2
13.04.2020, 01:50
2 ответа

Я не думаю, что есть способ сделать это с помощью POSIX-совместимого grepили awk, потому что стандарт требует самого длинного совпадения, действительно (см., например, regex(7)справочную страницу ).

С помощью awkвы можете получить желаемый результат, изменив программу awkи регулярное выражение, например

echo 'SetValue' | awk '{ if (match($0, /Set(Value)?/)) { print substr($0, RSTART, 3); }

В этой ситуации я бы взялpcregrep(часть библиотеки регулярных выражений, совместимую с pcre perl ), которая позволяет указать пронумерованную подгруппу с помощью-o:

echo SetValue | pcregrep -o1 '(Set)(Value)?'

или, поскольку pcre имеет синтаксис для не -жадного сопоставления,

echo SetValue | pcregrep -o0 'Set(Value)??'
3
19.03.2021, 02:29

Насколько я мог это понять, получается, что на самом деле есть две машины NFA:

  • Традиционный двигатель NFA
    Машина NFA, которая откатывается назад и для которой самое длинное -самое левое совпадение, не всегда может соблюдаться .

  • Механизм POSIX NFA
    Механизм NFA без возврата -, который обрабатывает все состояния параллельно и может выбрать любое совпадение во входной строке. Выбор самого левого и самого длинного совпадения является требованием POSIX.

Однако машина обратного поиска DFA (Perl ), которая может раздуваться экспоненциально (2^n)управляется текстом (, а не регулярным выражением ), и может выбирать первым из чередования (или нет ).

Также говорят, что DFA распознает все возможные совпадения параллельно .

И, от автора статьи, связанной с вопросом, реализация re2 определяет чередование как :x|y ==> x или y (предпочитает x ), то есть :предпочитают первое из чередования.

Таким образом, в заключение, нет никакого способа фактически связать NFA или DFA с тем, какая часть чередования будет выбрана, это зависит от конкретной реализации.

И нет, я не нашел способа указать конкретной реализации изменить значение по умолчанию.

Связанные:

1
19.03.2021, 02:29

Теги

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