Извлечение регулярных выражений

#regex

#регулярное выражение

Вопрос:

Вот строка ввода:

 loadMedia('mediacontainer1', 'http://www.something.com/videos/JohnsAwesomeVideo.flv', 'http://www.something.com/videos/JohnsAwesomeCaption.xml', '/videos/video-splash-image.gif)
  

С помощью этого регулярного выражения: ‘. .xml’

… мы получаем это:

 'mediacontainer1', 'http://www.something.com/videos/JohnsAwesomeVideo.flv', 'http://www.something.com/videos/JohnsAwesomeCaption.xml'
  

… но я хочу извлечь только это:

 http://www.something.com/videos/JohnsAwesomeCaption.xml
  

Есть предложения? Я уверен, что эта проблема задавалась раньше, но ее трудно найти. Я буду рад принять решение.

Спасибо!

Комментарии:

1. что это за разновидность регулярного выражения?

Ответ №1:

Если вы хотите получить все, что заключено в кавычки и начинается с http:

 (?<=')http:[^'] (?=')
  

Если вам нужны только те, которые заканчиваются на .xml

 (?<=')http:[^'] .xml(?=')
  
  • Он не выбирает кавычки (как вы просили)
  • Это быстро!

Справедливое предупреждение: это работает, только если используемый вами движок регулярных выражений может обрабатывать lookbehind

Комментарии:

1. Я пытался изучить ваше решение, чтобы я мог его понять, но я не уверен в знаке =. Что это делает? Несколько популярных сайтов регулярных выражений, которые я проверил, вообще не упоминают знак =. Спасибо.

2. Это часть синтаксиса поиска: (?<=). Здесь это довольно хорошо описано: regular-expressions.info/lookaround.html

Ответ №2:

Знание языка было бы полезно. По сути, у вас возникла проблема, потому что квантификатор является жадным, что означает, что он будет соответствовать наибольшей части строки, которую он может. вам нужно использовать нежадный квантификатор, который будет соответствовать как можно меньше.

Нам нужно знать язык, на котором вы работаете, чтобы знать, каким должен быть синтаксис для нежадного квантификатора.

Вот рецепт perl. Просто в качестве примечания, вместо . , вы, вероятно, захотите сопоставить [^.] .xml .

 '. ?.xml'
  

должно сработать, если ваш язык поддерживает регулярные выражения, подобные perl.

Комментарии:

1. Я выбрал другой ответ, но ваша информация все равно оказалась полезной, и я узнал, что такое «жадный» и «нежадный». Это поможет мне писать регулярные выражения в будущем. Приветствия. Язык, кстати, Java / JSP. Мы используем библиотеку тегов JSP «transformText» (находится в www.infoglue.org , CMS на основе Java, такая как Drupal и т.д.). Я не совсем уверен, соответствует ли это стилю Perl.

2. рад, что это помогло! понимание жадности и нежадности (иногда называемой «скупостью») избавит вас от многих головных болей при отладке в будущем!

Ответ №3:

Это должно сработать (протестировано на javascript, но почти уверен, что это сработает в большинстве случаев)

 '[^'] ?.xml'
  

он ищет эти правила

  • начинается с '
  • за ним следует что угодно, но '
  • заканчивается .xml'

вы можете продемонстрировать это на http://RegExr.com ?2tp6q

Комментарии:

1. Это тоже сработало. Я принял другой ответ, потому что хотел, чтобы выходные данные не включали кавычки. В любом случае проголосовал против. Приветствия.

Ответ №4:

в .net это регулярное выражение работает для меня:

 '[w:/.] .xml'
  

разбиваем его:

  • символ ‘
  • за которым следует символ слова или ‘:’ или ‘/’ или ‘.’ любое количество раз (которое соответствует биту URL)
  • за которым следует ‘.xml’ (который отличает искомую строку от других URL, которым она будет соответствовать без этого)
  • за которым следует другой символ ‘

Я протестировал это здесь

Редактировать Я пропустил, что вам не нужны кавычки в результате, и в этом случае, как было указано, вам нужно использовать look behind и look ahead, чтобы включить кавычки в поиск, но не в ответ. снова в .net:

 (?<=')[w:/.] .xml(?=')
  

но я думаю, что лучшим решением является комбинация уже предложенных:

 (?<=')[^'] .xml(?=')
  

которое кажется самым простым для чтения, по крайней мере, мне.

Комментарии:

1. Вы перепутали экранирование точек — удалите обратную косую черту внутри символьного класса, добавьте одну перед последней точкой.

2. @Tim оба варианта работают с заданным вводом, но вы правы насчет обратной косой черты перед конечной точкой, поскольку мы хотим, чтобы это была явно точка