2013-10-05 24 views
0

好的,快速的問題。我在Java上是一個新手,我有一個任務,我必須從頁面的標題標記中獲取一個人的姓名。我知道我的正則表達式,但我不能(或不知道如何)逃避某些角色。java正則表達式解析部分標題標記

<title>Mr. Somebody | Department in which he's in</title> 

所以,基本上我需要一個正則表達式,將讓我的「有人先生」。我試過了:

Pattern pat = Pattern.compile("<title>(.+?)|");        
Matcher mat = pat.matcher(data); 
boolean found = false; 
while (!found && mat.find()) { 
     name = mat.group(0); 
     found = true; 
} 
System.out.println("Found a name : " + name); 

我的問題是,無論我嘗試過什麼,我能得到的最多的是第一個字符。你認爲使用indexOf和substrings更簡單的方法會更好,還是正則表達式仍然可行?

我知道通常regexps不適合解析html標籤,但我正在考慮更多的字符串搜索,因爲我對整個標籤(或其他可能包含的標籤)不感興趣, 。

任何形式的幫助是極大的讚賞:)

回答

1

你需要躲避管,因爲它是用正則表達式有特殊含義的字符。嘗試:

<title>(.+?)\\| 

|手段「或」這意味着正則表達式將嘗試匹配任何<title>(.+?)或沒有(有在|後沒有

當它試圖匹配<title>(.+?),它會得到只有第一個字符,因爲.+?是偷懶或者(它匹配儘可能少)

,你可以用一個否定類:

<title>([^\\|]+) 

[^\\|]+將匹配除管道以外的任何字符。

+1

爲了說清楚一點,你必須使用雙反斜槓(就像@Jerry所做的那樣),因爲你需要編譯欄來逃避角色,但是一個反斜槓是不夠的,因爲你是在一個字符串中,那麼你需要轉義字符串反斜槓以獲得正則表達式轉義。有關於正則表達式的一些非常好的和深入的信息在這裏http://www.regular-expressions.info/java.html –

+0

@CaioToOn對。謝謝闡述! – Jerry

+1

感謝你們,我確實想逃避('\ |'),但顯然它必須逃避Java的逃跑。 謝謝,你真的很有幫助! :D – Sabin

0

它應該工作

Pattern pat = Pattern.compile("<title>(.*?)\\|"); 

,並使用

mat.group(1) instead of mat.group(o); 
0

這裏有一個辦法做到這一點,這將避免使用模式和匹配器,如果你想:

String name = "<title>Mr. Somebody | Department in which he's in</title>"; 
name = name.substring(7).replaceAll("\\|.*", ""); 

的子(7)將刪除第一個標記,然後replaceAll將從管道字符向前刪除所有內容(替換爲空字符G)。

0

也許這你想要什麼:

(?<=<title>)(.+?(?=[|].+?))(?=.+?</title>) 

它返回有人先生。例如,您可以測試它here

+0

感謝這個,更詳細的例子:) – Sabin

0

這裏有一個辦法:

<\s*title[^>]*>\s*([^\|]+) 
  • 帶走前導空格。
  • 處理任何可能的屬性怪異,有人可能會增加一個標題標籤,即<title data-cookies="I hide cookies here :P">I like titles</title>
  • 把手標題前加任何空格,即< title >仍然有效。