0

我正在构建一个 JSP,但我是正则表达式的新手并且遇到了一些麻烦。我有一个很长的字符串,其模式如下所示:

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

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

4

2 回答 2

2

你可以使用这个正则表达式:

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

此表达式捕获两对等号之间的字符串,然后获取所有内容,直到=字符串的下一个或结尾。ID成为第一个捕获组;数据成为第二个。组从一开始编号,而不是从零开始编号(组零是特殊的 - 它代表整个比赛)。

这是一个完整的例子:

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(ie group(2)),你就可以String.split在破折号上运行 a 来分离出各个数据元素。

于 2013-07-16T15:24:38.520 回答
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);
}

这首先使用与“名称”匹配的前瞻进行拆分 - 前瞻是非捕获的,因此为下一步保留名称。

然后,名称和值字符串将名称部分提取出来,并将值部分拆分为破折号。完成所有正则表达式匹配,以便从目标中修剪空白。

我已经对其进行了测试,并且效果很好——去掉了名称和值周围的任何可选空格。

于 2013-07-16T15:28:46.980 回答