2010-02-04 8 views
2

Я нашел интересную возможность во многих двигателях регулярных выражений:Regex: рекурсивные обратные ссылки - зачем?

В группу захвата можно поместить backreference и ссылаться на эту группу.

Например: (\1)

Мой вопрос: для того, что регулярное выражение модели он может быть использован? Я не могу себе представить ...

+5

, если вам нужно узнать индекс второго появления? – SilentGhost

+0

SilentGhost, вы должны были разместить это как ответ. –

+0

@SilentGhost: Я считаю, что это должен быть ответ. – sepp2k

ответ

3

Существует explanation for use of nested references, что, я думаю, наглядно демонстрирует предельную полезность этой функции.

+0

Пример regex, пожалуйста. – ControlFlow

+0

Если вы внимательно прочитали мой вопрос, вы поймете, что я не спрашиваю о том, как обычно используются обратные ссылки. Посмотрите, где обратная ссылка была помещена в пример regex, который я предоставляю. – ControlFlow

+0

@ControlFlow: Я не могу представить, что '(\ 1)' может соответствовать или быть полезным или даже компилировать. Этот вопрос ограничен .net? Если нет, предоставьте нам некоторые фактические примеры – SilentGhost

0

Как об этом (игнорировать пробелы):

{ .* ({ .* \1 .* }) .* }

, чтобы соответствовать тело метода в C#/Java/...

+0

Это не сработает, backreference совпадает с совпадающим текстом группы захвата 1, а не с шаблоном в самой группе 1. – ControlFlow

+0

@ControlFlow: Это просто должно быть '(? 1)' вместо '\ 1', и оно действительно будет рекурсивно работать на приличных двигателях регулярных выражений. – tchrist

1

У меня длинные YAML схемы, которые мне нужно/хочу изменить от этого:

columns: 
    id: 
     type: string(36) 
     fixed: true 
     unsigned: false 
     primary: true 
     autoincrement: false 
    descripcion: 
     type: string(45) 
     fixed: false 
     unsigned: false 
     primary: false 
     notnull: true 
     autoincrement: false 

для этого:

columns: 
    id: {type: string(36), fixed: true, unsigned: false, primary: true, autoincrement: false} 
    descripcion: {...}... 

В этом случае мне нужен уровень рекурсии в backrefences, потому что имена столбцов находятся между описаниями столбцов. Это подходит для каждой строки, но я не могу поставить «{}» Arround $ 1, я бы в конечном итоге с кронштейнами между каждым полем описания:

"\n^  ([^\n]+)" 

 Смежные вопросы

  • Нет связанных вопросов^_^