2013-07-16 40 views
0

我正在构建一个JSP,但我是新来的正则表达式,我有一些麻烦。我有一个很长的字符串,看起来像这样的模式:正则表达式匹配java中的一个长字符串中的字符

==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文档。

还有一点需要注意,一个“item”可以不只一个单词。

编辑:这是到目前为止我的代码

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

啊!你从哪里得到你的JSP中的字符串? –

+0

这个问题听起来好像用流解析器可以解决更好的问题......读取char字符,直到命中==,然后将名称存储到下一个== ==然后,... – Lucas

+0

Rohit,它是一个硬编码的字符串。 –

回答

2

您可以使用正则表达式:

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

这种表达captures2对等号之间的字符串,然后采取一切,直到下一个=或字符串的结尾。 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)); 
} 

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

+0

谢谢这是一个很好的帮助! –

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

使用了在“名称”相匹配的前瞻这首先分裂 - 看aheads是非捕获,从而保留下一步的名称。

name-and-values String然后提取名称部分,并将值部分分割成短划线。所有正则表达式匹配都是这样完成的,即从目标中删除空白。

我测试过它,它运行良好 - 剥离任何名称和值的可选空白。