Каково различие между 'Жадными' и 'Неохотными' кванторами регулярного выражения?

Это пытается ввести некоторое Совершенство Ruby:)
Понятие: Это - некоторый демонстрационный код Ruby, который распечатывает каждый элемент массива

 rubyArray = [1,2,3,4,5,6,7,8,9,10]
    rubyArray.each{|x| 
        puts x   # do whatever with x
    }

каждая реализация метода Массива урожаи управление вызывающей стороне ('помещает x') с каждый элемент массива, аккуратно представленного как x. Вызывающая сторона может тогда сделать то, что это должно сделать с x.

Однако .Net не идет полностью сюда.. C#, кажется, связал урожай с IEnumerable, способом вынуждая Вас записать цикл foreach в вызывающей стороне, как замечено в ответе Mendelt. Немного менее изящный.

//calling code
foreach(int i in obCustomClass.Each())
{
    Console.WriteLine(i.ToString());
}

// CustomClass implementation
private int[] data = {1,2,3,4,5,6,7,8,9,10};
public IEnumerable<int> Each()
{
   for(int iLooper=0; iLooper<data.Length; ++iLooper)
        yield return data[iLooper]; 
}
22
задан Duncan Jones 16 March 2015 в 11:03
поделиться

5 ответов

Жадный оператор всегда пытается «схватить» как можно больше входных данных, в то время как неохотный квантификатор будет соответствовать как можно меньшему количеству входных данных и все равно создавать совпадение.

Пример :

"The red fox jumped over the red fence"
/(.*)red/ => \1 = "The red fox jumped over the "
/(.*?)red/ => \1 = "The "

"aaa"
/a?a*/ => \1 = "a", \2 = "aa"
/a??a*/ => \1 = "", \2 = "aaa"

"Mr. Doe, John"
/^(?:Mrs?.)?.*\b(.*)$/ => \1 = "John"
/^(?:Mrs?.)?.*?\b(.*)$/ => \1 = "Doe, John"
38
ответ дан 29 November 2019 в 03:59
поделиться

Из по этой ссылке , где автор руководства признает суть вашего вопроса:

На первый взгляд может показаться, что кванторы X ?, X ?? и X? + делать в точности то же самое, так как все они обещание сопоставить "X, один раз или нет в все ». Есть тонкая реализация различия, которые будут объяснены ближе к концу этого раздела.

Далее они собирают примеры и предлагают объяснение:

Жадные кванторы считаются «жадные», потому что они заставляют сопоставитель, чтобы прочитать или съесть весь входная строка перед попыткой первый матч. Если первое совпадение попытка (вся входная строка) сбой, сопоставитель отключает ввод строка по одному символу и пытается снова, повторяя процесс до тех пор, пока совпадение найдено или больше нет символов осталось отступить от. В зависимости от квантификатора, используемого в выражение, последнее, что это будет попробуйте сопоставить с 1 или 0

Однако неохотные кванторы используйте противоположный подход: они начинают в начале входной строки, затем неохотно съесть одного персонажа в время искать совпадение. Последний то, что они пробуют, - это весь ввод строка.

И для дополнительной похвалы, притяжательное объяснение:

Наконец, притяжательные кванторы всегда есть всю строку ввода, пытаясь один раз (и только один раз) для соответствие. В отличие от жадных квантификаторов, притяжательные кванторы никогда не отступают, даже если это позволит полное совпадение для успеха.

10
ответ дан 29 November 2019 в 03:59
поделиться

Жадный квантификатор будет соответствовать как можно большему количеству, но все равно будет соответствовать Неохотный квантификатор будет соответствовать наименьшему возможному количеству.

например, учитывая строку

abcdef

, жадный квалификатор

ab [az] * [az] будет соответствовать abcdef

сопротивляющемуся квалификатору

] ab [az] *? [az] будет соответствовать abc

3
ответ дан 29 November 2019 в 03:59
поделиться

say you have a regex "a\w*b", and use it on "abab" Greedy matching will match "abab" (it looks for an a, as much occurrences of \w as possible, and a b) and reluctant matching will match just "ab" (as little \w as possible)

3
ответ дан 29 November 2019 в 03:59
поделиться

Имеется документация о том, как Perl обрабатывает эти квантификаторы perldoc perlre .

По умолчанию квантифицированный подшаблон является «жадным», то есть он будет соответствовать как можно большему количеству раз, насколько это возможно (учитывая конкретное начальное местоположение), при этом позволяя остальной части шаблона совпадать. Если вы хотите, чтобы оно совпадало минимально возможное количество раз, введите после квантификатора «? ». Обратите внимание, что значения не меняются, только «жадность»:
  *? Совпадение 0 или более раз, не жадно
+? Совпадение 1 или более раз, не жадно
?? Матч 0 или 1 раз, не жадно
{n}? Совпадение ровно n раз, не жадно
{n,}? Матч не менее n раз, не жадно
{п, м}? Совпадение не менее n, но не более m раз, не жадно
По умолчанию, когда количественно определенный подшаблон не позволяет сопоставить остальную часть общего шаблона, Perl выполняет возврат. Однако такое поведение иногда нежелательно. Таким образом, Perl также предоставляет «притяжательную» форму квантора.
  * + 0 или более совпадений и ничего не возвращать
 ++ Совпадение 1 или более раз и ничего не вернуть
 ? + Сопоставьте 0 или 1 раз и ничего не верните
 {n} + совпадение ровно n раз и ничего не вернуть (избыточно)
 {n,} + сопоставить не менее n раз и ничего не вернуть
 {n, m} + найти не менее n, но не более m раз и ничего не вернуть
Например,
  'aaaa' = ~ / a ++ a /
никогда не будет соответствовать, так как a ++ поглотит все a в строке и не оставит ничего для оставшейся части шаблона. Эта функция может быть чрезвычайно полезной для подсказок Perl о том, где не следует возвращаться. Например, типичная задача «сопоставить строку в двойных кавычках» может быть наиболее эффективно решена, если записать ее как:
  / "(?: [^" \\] ++ | \\.) * + "/
как мы знаем, если окончательная цитата не совпадает, возврат с возвратом не поможет. Подробнее см. Независимое подвыражение (?> ...) ; притяжательные квантификаторы - это просто синтаксический сахар для этой конструкции. Например, приведенный выше пример можно также записать следующим образом:
  / "(?> (?: (?> [^" \\] +) | \\.) *) »/
2
ответ дан 29 November 2019 в 03:59
поделиться
Другие вопросы по тегам:

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