我正在构建一个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 == ...
所以它有“标识符”,用“==”字符括起来,后跟一个短划线“ - ”分隔列表。我正在尝试提取Indentifiers及其item元素。一旦我从字符串中提取了信息,我就计划用信息构建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>
非常感谢任何帮助。谢谢
答案 0 :(得分:2)
您可以使用此正则表达式:
==([^=]+)==([^=]+)(?=(?:=|$))
这个表达式captures是两对等号之间的字符串,然后将所有内容都带到下一个=
或字符串结尾。 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));
}
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
以分隔各个数据元素。
答案 1 :(得分: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);
}
首先使用与“名称”匹配的预测进行拆分 - 向前看是非捕获的,因此保留了下一步的名称。
名称和值String然后提取名称部分,并在短划线上拆分值部分。完成所有正则表达式匹配,以便从目标中修剪空白。
我测试了它并且效果很好 - 剥离名称和值周围的任何可选空格。