2014-08-28 40 views
2

編輯:請確認您撥打匹配#匹配或匹配器#嘗試使用組之前找到! SourceJava正則表達式 - 試圖從以某個字符串開頭的行中隔離文本?


我試圖做一些事情很簡單 - 我想從與一個字開頭的行的文本。在這種情況下,這個詞是Location:。我是從原始的HTML看了那麼感興趣的行實際上是這樣的:

 Location: Main Hall 

很明顯,我想Main Hall返回給我,讓我能讀懂我的應用程序的位置。

這是我已經試過:

String t_location = ""; 
Pattern t_pat = Pattern.compile("^[\\s]+?(?s)Location: (?-s)(.*)$"); 
Matcher t_match = t_pat.matcher(t_inner_html); 
t_location = t_match.group(0); 

但我不斷收到錯誤:

java.lang.IllegalStateException: No successful match so far

打破我的正則表達式,這是(我認爲)我這樣做:

^ - 從行首開始讀取

[\\s]+? - 帶難色預選賽,在該行的開始閱讀的空白,直到我們打別的

(?s)Location: (?-s) - 文本字符串「的位置:」讀

(.*)$ - 讀取字符(除換行符)直到行尾

這就是我在做的事THINK。我並不擅長Regex,但我試圖按照文檔無濟於事。有人可以幫幫我嗎?


例如來說,字符串t_inner_html看起來是這樣的:

8/28/2014 
     Alumni Reunion 
     Location: Main Hall 

     <span class="extra-info"> 
      Blah blah blah.... 
     </span> 

回答

1

如果這不是Java,此正則表達式應該工作,這取決於你的最終的線(EOL)字符序列是什麼:

(.|\n)*Location:\s*(.*)\n 

你想要的字符串是在組索引1

現在,因爲這個正則表達式將是一個Java String裏面,因爲反斜槓是Java中的字符串轉義字符,你會真正有雙反斜線污染純粹的正則表達式:

Pattern t_pat = Pattern.compile("(.|\\n)*Location:\\s*(.*)\\n"); 

一般情況下,測試正則表達式,我真的很喜歡這個工具:

http://regexpal.com/

這是一個交互式測試,將逐步凸顯您的樣本輸入,因爲它正則表達式匹配。當您編輯正則表達式或更改示例輸入時,匹配突出顯示將實時更新。這不支持Java所需的雙反斜槓,因此請在工具中單擊測試,將它們粘貼到Java,然後添加額外的反斜槓。

你也可以玩弄這個工具,這是不一樣的實時,但不支持Java String正則表達式:

http://www.regexplanet.com/advanced/java/index.html

要打破我有:

(.|\n)* - 零個或多個字符或EOL序列

Location: - 字符串「位置:」

\s* - 零個或多個空格

(.*) - 由絕什麼的正則表達式組,這是你將捕獲什麼

\n - EOL序列

您可能需要\r\n如果更換\n你在Windows上,但首先嚐試\n並查看。

這將匹配通過「主廳」的樣本輸入中的所有內容,並且在(<span . . .>等)之後將忽略所有內容。「主廳」將在比賽組1中結束。

+0

我有一種感覺,這應該工作,但事實並非如此。 – 2014-08-28 05:09:50

+0

您的輸入文字只是「位置:主廳」這一行,還是以「8/28/2014」開頭的整個塊?如果是後者,那麼你現在正匹配多行而不是單行,而且這是一個有點不同的故事。 – 2014-08-28 05:12:28

+0

是的,它是多行,'t_inner_html'就是我正在看的東西。我試着用'(?m)'標誌來表達你的表情。 – 2014-08-28 05:13:24

0

首先使用字符串的indexOf方法找到閹行包含 「位置」。 然後使用str.replace(「Location:」,「」);在具有「位置:」的線上。

1

請嘗試以下方法:

String t_location = ""; 
    Pattern t_pat = Pattern.compile("^\\s+Location:\\s+(.*)$", Pattern.MULTILINE); 
    Matcher t_match = t_pat.matcher(t_inner_html); 
    if (t_match.find()) { 
     t_location = t_match.group(1); 
    } 

您需要使用Pattern.MULTILINE的表達式^和$每行,而不是匹配整個字符串。


Java Fiddle Demo

+0

這也是一個有效的答案。 – 2014-08-28 15:14:29

相關問題