2015-06-01 2 views
1

Возможно, это просто, но я не нашел способ добиться следующего поведения регулярного выражения. Я хочу совместить подстроки, которые начинаются с {! и заканчиваются !}. Я пробовал следующее регулярное выражение: {!.*!}. Но я хочу исключить те, которые начинаются с строки --.Найти диапазон «целей», которых нет в комментариях с помощью Regex

Например, предположим, что у нас есть три линии:

-- Here is some comment {!0-goal!} 
{!1-goal!} 
Here is some text and {!3-goal!} 

Я хочу, чтобы соответствовать {!1-goal!} и {!2-goal!}, но не {!0-goal!}. Какие-либо предложения?

Расширенной ВОПРОС:

Как оказалось, мне нужно будет разобрать и такого рода «целей».

https://regex101.com/r/xL1eY3/5

Как насчет этого? Я думаю, что это, вероятно, в несколько раз труднее достичь, правильно? Если кто-то может мне помочь, я бы очень признателен. Если нет, то я буду писать свой собственный парсер, что в Objective-C, но я хочу, чтобы избежать этого по понятным причинам :)

+0

Что такое аромат регулярного выражения? –

+0

Любой вкус будет прекрасным, но в конечном итоге я буду использовать его в приложении OS X. Я просто хочу понять, как построить такое регулярное выражение. – markich

ответ

2

Вы можете сделать это с помощью захвата группы:

^(?!--).*(\{![^!]*!\}) 

Пожалуйста, обратите внимание этому регулярному выражению нужен флаг m (многострочный). В Objective-C это будет NSRegularExpressionAnchorsMatchLines. И возьмите значение, сохраненное в первой захваченной группе.

См. demo.

EDIT:

невозможно получить результаты для вашего обновленного входа, используя только регулярные выражения. Проблема в том, что Regex Objective C не поддерживает внешний вид переменной ширины. Таким образом, решение вам нужно, это линия

  • процесса по линии
  • Если строка начинается с --, выбросьте его
  • Если строка не начинается с --, применять (?=(\{!(?:[^!]|\{![^!]*!\})*!\})) регулярное выражение.
+0

Если тестируемые строки уже предварительно отфильтрованы, в этой точности нет необходимости. Эта конструкция, которую вы используете, часто приводит к катастрофическому обратному отскоку. –

+0

Но это не соответствует целям, как '{! 5-goal {! 6-goal!} {! 7-goal!}!}'. Я подожду еще некоторое время, и я приму свой ответ, так как вы правильно ответили на первый вопрос ... Спасибо! – markich

+0

Ну, я добавил еще одно регулярное выражение, которое собирает все '{...}' s только с 1 поддержкой вложенного уровня. Он захватывает эти объекты, а не * совпадает *. Вам нужно будет получить доступ к группе захвата 1, чтобы извлечь содержимое. Надеюсь, этого достаточно. Если нет, нам нужно будет добавить дополнительную поддержку вложенного уровня вручную. –

1

Вы можете использовать следующее соответствие:

/^(?!\s*--).*({!(?:(?!!}).)+!})/gm 

И экстракт $1 (группа 1)

См DEMO

Пояснение:

  • ^(?!\s*--) опережения Assert ион для начала с чего угодно, кроме -- или (space) --