2013-07-16 37 views
0

我正在構建一個JSP,但我是新來的正則表達式,我有一些麻煩。我有一個很長的字符串,看起來像這樣的模式:正則表達式匹配java中的一個長字符串中的字符

==SOME_ID== - item 1 - item 2 - item 3 .. item 100 == SOME_ID_2 == - item 1 - item 2 - item 3 ... item 100 == SOME_ID_3 == ... 

因此它具有「標識」,這是包含在「==」字符,後跟一個破折號「 - 」分隔的列表。我試圖提取標識符和它們的項目元素。一旦我從字符串中提取信息,我計劃用這些信息構建一個XML文檔。

還有一點需要注意,一個「item」可以不只一個單詞。

編輯:這是到目前爲止我的代碼

<% 
String testStr = (String)pageContext.getAttribute("longStr"); 
String[] ids = null; 
String delimeterRegex = "(?i),==*=="; 
ids = testStr.split(delimeterRegex); 
pageContext.setAttribute("ids", ids); 
%> 



<c:forEach items="${ids}" var="id"> 
    ${id} 
</c:forEach> 

任何幫助將不勝感激。謝謝

+0

啊!你從哪裏得到你的JSP中的字符串? –

+0

這個問題聽起來好像用流解析器可以解決更好的問題......讀取char字符,直到命中==,然後將名稱存儲到下一個== ==然後,... – Lucas

+0

Rohit,它是一個硬編碼的字符串。 –

回答

2

您可以使用正則表達式:

==([^=]+)==([^=]+)(?=(?:=|$)) 

這種表達captures2對等號之間的字符串,然後採取一切,直到下一個=或字符串的結尾。 ID成爲第一個捕獲組;數據成爲第二個。組編號從1開始,而不是從0開始(組0是特殊的 - 它代表整個匹配)。

下面是一個完整的例子:

String data = "==SOME_ID== - item 1 - item 2 - item 3 .. item 100 == SOME_ID_2 == - item 1 - item 2 - item 3 ... item 100 == SOME_ID_3 == ..."; 
Pattern p = Pattern.compile("==([^=]+)==([^=]+)(?=(?:=|$))"); 
    Matcher m = p.matcher(data); 
while (m.find()) { 
    System.out.println("ID="+m.group(1)); 
    System.out.println("Data="+m.group(2)); 
} 

Demo on ideone.

ID=SOME_ID 
Data= - item 1 - item 2 - item 3 .. item 100 
ID= SOME_ID_2 
Data= - item 1 - item 2 - item 3 ... item 100 
ID= SOME_ID_3 
Data= ... 

一旦你的data(即group(2)),你可以運行在破折號String.split分離出單個數據元素。

+0

謝謝這是一個很好的幫助! –

1

下面是一些代碼,將創建地圖的名稱與其值的數組:

Map<String, String[]> map = new HashMap<String, String[]>(); 
for (String mapping : input.split("(?<!^)(?===\\s*\\w+\\s*==)")) { 
    String name = mapping.replaceAll("^==\\s*(\\w+).*", "$1"); 
    String[] values = mapping.replaceAll("^==\\s*\\w+\\s*==\\s*-*\\s*", "").split("\\s*-\\s*"); 
    map.put(name, values); 
} 

使用了在「名稱」相匹配的前瞻這首先分裂 - 看aheads是非捕獲,從而保留下一步的名稱。

name-and-values String然後提取名稱部分,並將值部分分割成短劃線。所有正則表達式匹配都是這樣完成的,即從目標中刪除空白。

我測試過它,它運行良好 - 剝離任何名稱和值的可選空白。