2015-08-24 3 views
0

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

String tring =Format_FRMT: <<<$gen>>>(((valu e))) <<<$gen>>>(((value 13231))) 
<<<$gen>>>(((value 13231))) 

Regex модель я сделал это:

Pattern p = Pattern.compile("\\<{3}\\$([\\w ]+)\\>{3}\\s?\\({3}([\\w ]+)\\){3}"); 

Когда я бегу всю программу

Matcher m = p.matcher(tring); 

    String[] try1 = new String[m.groupCount()]; 

    for(int i = 1 ; i<= m.groupCount();i++) 
    { 
     try1[i] = m.group(i); 
     //System.out.println("group - i" +try1[i]+"\n"); 
    } 

я получаю

Соответствие не найдено

Может ли кто-нибудь помочь мне в этом? где именно это происходит не так? Моя первая цель - просто посмотреть, могу ли я получить значения в соответствующих группах или нет. и если это работает нормально, я бы хотел использовать их для дальнейшей обработки.

Благодаря

+0

'Pattern p = Pattern.compile \\ <{3} \\ $ ([\\ w] +) \\> {3} \\ s? \\ ({3} ([\\ w] +) \\) {3}); '??? Как?? –

+0

Как указывает Авинаш, ваш код не является синтаксически действительным и не может быть скомпилирован. Начните с удаления большей части вашего шаблона и просто начните просто: например, просто сравните три меньше. Это работает? Затем добавьте знак доллара и т. Д. – dsh

+0

Я пропустил скобок, я отредактировал вопрос! –

ответ

3

Вот exaple о том, как получить все необходимые значения с find():

String tring = "CHARDATA_FRMT: <<<$gen>>>(((valu e))) <<<$gen>>>(((value 13231)))\n<<<$gen>>>(((value 13231)))"; 
Pattern p = Pattern.compile("<{3}\\$([\\w ]+)>{3}\\s?\\({3}([\\w ]+)\\){3}"); 
Matcher m = p.matcher(tring); 
while (m.find()){ 
    System.out.println("Gen: " + m.group(1) + ", and value: " + m.group(2)); 
} 

См IDEONE demo

Обратите внимание, что вы не должны бежать < и > в Java регулярное выражение.

+0

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация. –

+0

Привет Спасибо за ваш ответ. Он работал частично. Если я изменю его на <{3} \\ $ [\\ w] +> {3} \\ s? \\ ({3} ([\\ w] +) \\) {3} I получит первое значение в группе (1). Чтобы получить два других значения, мне пришлось повторить одно и то же выражение дважды, или есть ли другой способ сделать это? Чтобы группа (1) дала мне оценку e, group (2), дайте мне значение 13231, а группа (3) дает мне значение 13231. Спасибо! –

+0

['while' должен обрабатывать] (http: // ideone.com/FeOP5W), так как это будут отдельные матчи. Значения, которые вам нужны, будут постоянно находиться в группе 1. Захватывающие группы соответствуют неограниченным круглым скобкам типа '(...)', если у вас 1, будет только '.group (1)'. –

2

После создания Matcher и, прежде чем ссылаться на свои группы, вы должны вызвать один из методов, который пытается фактическое совпадение, как find, matches или lookingAt. Например:

Matcher m = p.matcher(tring); 
if (!m.find()) return; // <---- Add something like this 
String[] try1 = new String[m.groupCount()]; 

Вы должны прочитать Javadocs на классе Matcher, чтобы решить, какие из указанных выше методов имеет смысл для ваших данных и приложения. http://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html

+0

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