2015-08-21 4 views
0

Я пытаюсь извлечь часть строки на основе согласованного шаблона. Например, возьмем следующую подпись к фотографии:Как определить части строки с помощью Regex?

В этом (антенного) фото, лесной пожар уничтожает дерево в горящем лесу рядом Омака, штат Вашингтон, в четверг, 20 августа, 2015. Пожарные на несколько. фронты борются против бушующих лесных пожаров, продвигающихся по городам в северо-центральной части штата. (Bettina Hansen/The Seattle Times через AP)

Я хочу, чтобы извлечь кредит фотографии в круглых скобках в конце. Я знаю, что эта часть всегда начинается с «(» и заканчивается «через AP»).

Я попытался это:

\(.*via AP\) 

, но он выбирает все от первой скобки (перед словом антенны) вплоть до последней скобки. Как я могу просто захватить часть между круглой скобкой, которая заканчивается «через AP»?

Спасибо!

ответ

0

Проблема заключается в том, что конструкция .* является жадным и будет с удовольствием соответствовать что угодно включая другие открывающиеся круглые скобки. На показанном входе это начинается с совпадения на «(антенна» и заканчивается совпадение на последним «через точку доступа» «после успешного согласования всех промежутков между ними.

Чтобы исправить это использовать более утонченную и, следовательно, менее жадную конструкцию:

\([^()]*via AP\) 

Это будет соответствовать открывающей скобке символ, а затем любым символам, за исключением другой скобки, прежде чем он совпадает «с помощью точки доступа». Конструкция [^..] является отрицательным символьным классом.

+0

Спасибо за ответ и объяснение ... дает полный смысл. Я удалил последнюю скобку (после AP) из вашей конструкции, чтобы она работала. – Jonathan

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