Регулярные выражения pcre: групповой захват и дизъюнкция — возврат значения по умолчанию при отсутствии совпадений

Я пытаюсь найти строку, чтобы сопоставить несколько групп захвата. В случае двух таких групп захвата данные являются необязательными, поэтому они могут совпадать или не совпадать. Я использую pcregrep с опцией -onumber для возврата различных групп захвата. Вопрос: как я могу вернуть значение по умолчанию, если значения не совпадают. Я пытался использовать дизъюнктив, но безуспешно.

Пример:

../pcre-8.32/pcregrep  -Min -o1 -o2 --om-separator="; " '(?s)<!-- BOUNDARY -->(?!.*?Read the full review).*?((\d*) of (\d*) people found the following review helpful|.*?).*?Help other customers find the most helpful' shirts/B000W18VGW

выдает правильные номера строк.

-Min -o1 -o2 --om-separator="; " '(?s)<!-- BOUNDARY -->(?!.*?Read the full review).*?(\d*) of (\d*) people found the following review helpful.*?Help other customers find the most helpful' shirts/B000W18VGW

выдает правильный вывод, но только для строк с

(\d*) of (\d*) people found the following review helpful

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

Возможно ли это, и если да, то как?


person user2051561    schedule 07.02.2013    source источник


Ответы (1)


Вы не можете заставить персонажа появиться волшебным образом. То есть, если в вашей строке темы нет 0, то нет возможности захватить 0. Таким образом, если вы хотите захватить 0, вы должны вставить 0 в тему.

Теперь, допустим, по какой-то безумной причине вы можете и хотите изменить свою строку темы (хотя, по-видимому, вы не можете или не хотите устанавливать регистр 0 вне регулярного выражения, т.е. в коде). Тогда вот одно решение.

Добавьте 0 of 0 people found the following review helpful в самый конец строки темы, а вместо этого:

((\d*) of (\d*) people found the following review helpful|.*?)

сделай это:

(?=.*?(\d*) of (\d*) people found the following review helpful)

Другими словами, добавляя 0 of 0 people [...], вы гарантируете, что это предложение будет существовать где-то, поэтому, захватив числа в утверждении с опережением нулевой ширины, вы можете искать предложение в любом месте вашей строки темы, прежде чем продолжить с остальной частью вашего регулярного выражения.

person slackwing    schedule 07.02.2013
comment
Цените обратную связь. К сожалению, ваше предложение невозможно. Я хотел бы отметить, что: 1. Я использую pcregrep для анализа всех вхождений в документе. Поэтому я не могу ничего добавить к строке. 2. Проблема здесь не в сопоставлении, а в отображении группового захвата. Я считаю, что групповой захват в дизъюнкции неверен. Я все еще думаю, что это возможно. Даже если я не могу захватить, как я показал; может потребоваться некоторая постобработка. - person user2051561; 08.02.2013
comment
@ user2051561 - я мог ошибаться; поэтому, пожалуйста, поправьте меня, если я. Я потратил дни, пытаясь вывести 0, когда пытался написать регулярное выражение, которое будет увеличивать числа. Я довольно глубоко изучил различные escape-последовательности и приемы, но не нашел способа захватить символ, которого нет нигде в документе. Теперь, вопреки всему, если вы найдете способ, то вы также нашли лучший ответ на связанный вопрос! - person slackwing; 08.02.2013
comment
Сомневаюсь. Но если я найду способ, я опубликую его здесь. - person user2051561; 08.02.2013