2013-07-16 6 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 == ... 

поэтому имеет «идентификатор», который заключен в символы «==», а затем тире «-» список разделенных. Я пытаюсь извлечь Indentifiers и их элементы элементов. Как только у меня есть информация, извлеченная из строки, я планирую построить XML-документ с информацией.

Еще одно примечание: «item» может быть более одного слова.

EDIT: Вот мой код до сих пор

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

Ah !! Где вы получаете эту строку из своего JSP? –

+0

Эти проблемы звучат так, как будто это было бы лучше разрешено с помощью парсера потока ... Прочитайте char by char, пока вы не нажмете '==', а затем сохраните имя до следующего '==' then, ... – Lucas

+0

Rohit, это жестко закодированная строка. –

ответ

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 на приборной панели, чтобы выделить отдельные элементы данных.

+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 ​​затем имеет часть имени, и части значений разделены на тире. Все совпадения регулярных выражений выполняются так, что пробелы обрезаются от целей.

Я протестировал его, и он хорошо работает - сбрасывает любые необязательные пробелы вокруг имени и значений.

Смежные вопросы