繁体   English   中英

正则表达式匹配Java中长字符串中的字符

[英]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));
}

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 ,以分离出各个数据元素。

这是一些将创建名称到其值数组的映射的代码:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM