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