我正在构建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>


任何帮助将不胜感激。谢谢

最佳答案

您可以使用以下正则表达式:

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


此表达式captures在两对等号之间的字符串,然后取所有内容,直到下一个=或字符串的末尾。 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来分离出各个数据元素。

07-25 23:59
查看更多