簡體   English   中英

正則表達式匹配Java中長字符串中的字符

[英]regex matching characters in a long string in java

我正在構建一個JSP,但是我對regex不熟悉,因此遇到了一些麻煩。 我有一個很長的字符串,其模式如下所示:

==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文檔。

再有一個注釋,一個“項目”可以是多個單詞。

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

<%
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>

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

您可以使用以下正則表達式:

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

該表達式捕獲兩對等號之間的字符串,然后進行所有運算,直到next =或字符串結尾。 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));
}

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 ,以分離出各個數據元素。

這是一些將創建名稱到其值數組的映射的代碼:

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);
}

首先使用與“名稱”匹配的先行方式進行拆分-先行捕捉不會捕獲,因此保留了下一步的名稱。

然后,將名稱和值字符串提取為名稱部分,並在破折號上拆分值部分。 完成所有正則表達式匹配,以便從目標中修剪空格。

我已經對其進行了測試,並且效果很好-刪除了名稱和值周圍的所有可選空格。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM