Как использовать Regex для сопоставления каждого вхождения строки между двумя окружающими строками, за исключением окружающих строк?

Я борюсь с регулярным выражением. Вот команда, которую я использую (запустив Cygwin в Windows) по предложению hwnd (которое решило мою предыдущую проблему):

grep -Po '(?<="id":)[^,]+' regex_test.txt

Как изменить регулярное выражение, чтобы созданное совпадение начиналось с , {id: ИЛИ : [{id:? К сожалению, текущее выражение также захватывает нежелательные идентификаторы, перед которыми стоит : {id:

Входной текстовый файл с именем regex_test.txt:

причина: {id: 25549177, «шаблон: null}, iphone: [{id: 2411977008, версия: null}, {id: 2430057923,

Вывод:

25549177

2411977008

2430057923

Желаемый результат:

2411977008

2430057923

Пожалуйста, дайте мне знать, что вы думаете по этим вопросам.


person Sonia    schedule 12.04.2015    source источник
comment
@ Сухой27 Этот вопрос не похож на дубликат: он о [pcre] и [grep]! (использование оболочки, а не perl.) как я понимаю. Также lookaround - интересная функция, не показанная в целевой ссылке на мнимые дубликаты.   -  person F. Hauri    schedule 12.04.2015


Ответы (1)


Вы можете использовать утверждение Позитивный просмотр назад (, как показано в связанном ответе ):

grep -Po '(?<="id":)[^,]+' regex_test.txt

Демонстрация Ideone

person hwnd    schedule 12.04.2015
comment
@hwnd Я столкнулся с другими проблемами. Как я могу изменить ваше регулярное выражение, чтобы созданное совпадение начиналось с , {id: ИЛИ : [{id: (более конкретное условие, чем текущее " id »:? К сожалению, текущее выражение также захватывает нежелательные идентификаторы, к которым добавляется : {id:. - person Sonia; 13.04.2015
comment
@ Соня, попробуй (?<=[[,]{"id":)[^,]+ - person hwnd; 13.04.2015
comment
@hwnd Это помогло. Я пытался убежать от [{персонажей. Спасибо! - person Sonia; 13.04.2015