我正在构建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
来分离出各个数据元素。