2016-11-09 4 views
0

Я создаю приложение на основе Sinatra и пытаюсь проанализировать длинную строку с использованием регулярного выражения, чтобы вытащить ссылку из него.Как использовать регулярное выражение для получения определенной части строки

Вот выдержка из строки с соответствующей информацией, что мне нужно извлечь:

time=18ms\n[INFO] Calculating CPD for 0 files\n[INFO] CPD calculation finished\n[INFO] Analysis report generated in 325ms, dir size=14 KB\n[INFO] Analysis reports compressed in 187ms, zip size=8 KB\n[INFO] Analysis report uploaded in 31ms\n[INFO] ANALYSIS SUCCESSFUL, you can browse http://sonar.company.com/dashboard/index/com.company.paas.maventestproject:MavenTestProject\n[INFO] Note that you will be able to access the updated dashboard once the server has processed the submitted analysis report\n[INFO] More about the report processing at http://sonar.company.com/api/ce/task?id=AVhFxTkyob-dgWZqnfIn\n[INFO] ----------------------------------------------------------------------- 

мне нужно, чтобы быть в состоянии осуществить следующее:

http://sonar.company.com/api/ce/task?id=AVhFxTkyob-dgWZqnfIn 

Ближайший я получил с /(?=http).[a*-z]*/, но это не так, как было найдено 615 матчей вместо 1.

Проблема также в том, что идентификатор AVhFxTkyob-dgWZqnfIn не является статистическим ic, изменение для каждой сборки.

Я использовал Rubular.com, чтобы найти правильное регулярное выражение, которое мне нужно использовать.

+0

Это любое хорошее: '/ http: \/\/\ S + /'? См. [Здесь] (http://www.rubular.com/r/aHG7BZZAmw) для демонстрации. –

+0

Вместо того, чтобы загружать весь файл в строку, прочитайте его по очереди. Таким образом, вы можете быстро отбросить строки, которые не начинаются с '[INFO]'. Затем проверьте строку с помощью '\ bhttp: // \ S *' и проанализируйте URL-адрес. –

+0

Вам необходимо указать правила для идентификации строки, которую вы хотите извлечь. В вашем примере вы показываете нужную строку, но не говорите нам * почему * именно эта строка. Это как сказать, что у вас есть массив чисел '[3,5,8,12,13,20]' и хотите знать, как выбрать '[3,5,13]'. Это потому, что это нечетные числа, простые числа или что-то еще? Вы должны начать свой вопрос с утверждения проблемы, а затем привести пример, когда это необходимо. Когда вы редактируете, чтобы уточнить, не добавляйте «EDIT:». Наконец, в будущем, пожалуйста, сваривайте свои примеры до самых простых вещей. –

ответ

2
>> string = '[your long string here]' 
>> regex = /(http:[\w\/.?=-]+)(\\n)/ 
>> string.scan(regex).first.first 
=> "http://sonar.company.com/api/ce/task?id=AVhFxTkyob-dgWZqnfIn" 

Следуя примеру выше, я в конечном итоге изменение регулярное выражение к следующему:

(http:\/\/sonar[\w\/.?=-]+task[\w\/.?=-]+(?!.\\n)) 

.. и вернуть его, как это:

string.scan(regex).first.first 

Причина, почему я модифицировал регулярное выражение связано с тем, что предыдущее регулярное выражение получило много результатов при подключении полной строки, а не к выдержке, находящейся в OP.

+0

Это почти работает (так как строка также содержит ссылки, прежде чем она также подходит для них). Я изменил ее, чтобы выглядеть так:// http: \/\/sonar [\ w \ /.? = -] +) (\\ n)/', но это также соответствует другой ссылке (которая находится в' ******** -Dsonar.host.url = http: //sonar.covisintrnd.com \ n [INFO] ') .. В любом случае, чтобы сказать, что он должен содержать что-то вроде 'task' или' id = 'или что-то подобное? – Fadi

+0

Хмм, странно .. Когда я попробовал это в своем приложении, он дал мне следующую ошибку: «ERROR NoMethodError: undefined method« first »for nil: NilClass' Я предполагаю, что он ничего не возвращает, поэтому он равен нулю. – Fadi

+0

Это regex работал (на rubular.com): '(http: \/\/sonar [\ w \ /.? = -] +) task [\ w \ /.? = -] + (?!. \\ n) ', но теперь он фактически возвращается (в фактическом рубиновом приложении):' [["http://sonar.company.com/api/ce/"]] '... hmm – Fadi

1

Есть проверенные инструменты, которые облегчат вашу задачу. Я бы рекомендовал использовать метод extract Ури:

require 'uri' 

str = "time=18ms\n[INFO] Calculating CPD for 0 files\n[INFO] CPD calculation finished\n[INFO] Analysis report generated in 325ms, dir size=14 KB\n[INFO] Analysis reports compressed in 187ms, zip size=8 KB\n[INFO] Analysis report uploaded in 31ms\n[INFO] ANALYSIS SUCCESSFUL, you can browse http://sonar.company.com/dashboard/index/com.company.paas.maventestproject:MavenTestProject\n[INFO] Note that you will be able to access the updated dashboard once the server has processed the submitted analysis report\n[INFO] More about the report processing at http://sonar.company.com/api/ce/task?id=AVhFxTkyob-dgWZqnfIn\n[INFO] -----------------------------------------------------------------------" 

URI.extract(str) 
# => ["http://sonar.company.com/dashboard/index/com.company.paas.maventestproject:MavenTestProject", 
#  "http://sonar.company.com/api/ce/task?id=AVhFxTkyob-dgWZqnfIn"] 

Тогда это просто вопрос найти ссылку вы хотите, и работать с ним.

Вы также захотите обратить внимание на все другие методы, которые URI приносит на вечеринку, поскольку он понимает, как разрывать и создавать URI в соответствии с RFC.

Не катите свой собственный код или регулярное выражение, чтобы делать то, что сделал кто-то еще, особенно если этот код хорошо протестирован. Вы избежите ловушек, в которые попадут другие. Авторы/разработчики URI управляют встроенным шаблоном, поэтому нам этого не нужно. И это намного сложнее, чем вы себе представляете, чтобы встретить RFC, например:

URI::REGEXP::PATTERN::ABS_URI 
"[a-zA-Z][\\-+.a-zA-Z\\d]*:(?:(?://(?:(?:(?:[\\-_.!~*'()a-zA-Z\\d;:&=+$,]|%[a-fA-F\\d]{2})*@)?(?:(?:[a-zA-Z0-9\\-.]|%\\h\\h)+|\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}|\\[(?:(?:[a-fA-F\\d]{1,4}:)*(?:[a-fA-F\\d]{1,4}|\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})|(?:(?:[a-fA-F\\d]{1,4}:)*[a-fA-F\\d]{1,4})?::(?:(?:[a-fA-F\\d]{1,4}:)*(?:[a-fA-F\\d]{1,4}|\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}))?)\\])(?::\\d*)?|(?:[\\-_.!~*'()a-zA-Z\\d$,;:@&=+]|%[a-fA-F\\d]{2})+)(?:/(?:[\\-_.!~*'()a-zA-Z\\d:@&=+$,]|%[a-fA-F\\d]{2})*(?:;(?:[\\-_.!~*'()a-zA-Z\\d:@&=+$,]|%[a-fA-F\\d]{2})*)*(?:/(?:[\\-_.!~*'()a-zA-Z\\d:@&=+$,]|%[a-fA-F\\d]{2})*(?:;(?:[\\-_.!~*'()a-zA-Z\\d:@&=+$,]|%[a-fA-F\\d]{2})*)*)*)?|/(?:[\\-_.!~*'()a-zA-Z\\d:@&=+$,]|%[a-fA-F\\d]{2})*(?:;(?:[\\-_.!~*'()a-zA-Z\\d:@&=+$,]|%[a-fA-F\\d]{2})*)*(?:/(?:[\\-_.!~*'()a-zA-Z\\d:@&=+$,]|%[a-fA-F\\d]{2})*(?:;(?:[\\-_.!~*'()a-zA-Z\\d:@&=+$,]|%[a-fA-F\\d]{2})*)*)*)(?:\\?(?:(?:[\\-_.!~*'()a-zA-Z\\d;/?:@&=+$,\\[\\]]|%[a-fA-F\\d]{2})*))?|(?:[\\-_.!~*'()a-zA-Z\\d;?:@&=+$,]|%[a-fA-F\\d]{2})(?:[\\-_.!~*'()a-zA-Z\\d;/?:@&=+$,\\[\\]]|%[a-fA-F\\d]{2})*)" 
Смежные вопросы