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

时间:2013-07-16 15:17:32

标签: java regex jsp

我正在构建一个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>

非常感谢任何帮助。谢谢

2 个答案:

答案 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));
}

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

答案 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然后提取名称部分,并在短划线上拆分值部分。完成所有正则表达式匹配,以便从目标中修剪空白。

我测试了它并且效果很好 - 剥离名称和值周围的任何可选空格。