[英]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));
}
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.