2016-11-09 83 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不是stat 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]'。是因爲他們是奇數,素數還是別的什麼?你需要用問題的陳述開始你的問題,然後在適當的時候提供一個例子。當您修改以澄清時,請不要添加「編輯:」。最後,未來,請將您的例子歸結爲最基本的要領。 –

回答

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

嗯,奇怪..當我在我的應用程序嘗試它時,它給了我以下錯誤:錯誤NoMethodError:未定義的方法'第一'爲零:NilClass'我猜它沒有返回任何東西,因此它是零.. – Fadi

+0

This正則表達式工作(在rubular.com上):'(http:\/\/sonar [\ w \ /。?= - ] +)任務[\ w \ /。?= - ] +(?!。\\ n) '但現在它實際上正在返回(在實際的紅寶石應用程序中):'[[「http://sonar.company.com/api/ce/」]] ...嗯 – Fadi

1

有很好的測試工具,可以讓你的工作更輕鬆。我推薦使用URI的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爲該方帶來的所有其他方法,因爲它瞭解如何根據RFC分解和構建URI。

不要推出自己的代碼或正則表達式來完成別人已經完成的工作,特別是當代碼經過良好測試時。你會避免別人會陷入的陷阱。 URI的作者/維護者管理內置模式,所以我們不需要。而且,它比你想象的要複雜得多,比如:

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})*)" 
相關問題