2016-04-03 4 views
1

Я пытаюсь извлечь имена параметров из строки кода pascal с помощью regex. Это самый сложный из того, с чем я пытаюсь работать. Обратите внимание, что никогда не будет белого пробела, и скобки всегда будут присутствовать.Захват нескольких экземпляров одной и той же группы в java regex

(rate:real;interest,principal:real) 

В настоящее время я получил ре следующим образом:

[(](?:([\w]*)(?:[:][\w])?[;|,]?)*[)] 

Я надеялся, что я мог получить доступ к каждому из группы захвата, как повторно проходит через параметр, но, видимо, я не могу. Для примера выше значения, которые мне нужны, будут «ставка», «интерес» и «главный».

Есть ли решение для этого? Мои собственные усилия привели меня to here, где они упоминают использование

«matcher() с while ... find()».

Я не совсем понимаю регулярные выражения и буду признателен за любую помощь. Благодарю.

ответ

1

Вы можете использовать positive lookbehind для этого, как

((?<=[\(,;])[A-Za-z_]\w*) 

Regex Разбивка

(
    (?<= #Positive look behind 
    [\(,;] #Finds all position that have bracket, comma and semicolon 
) 
    [A-Za-z_]\w* #After finding the positions, match all the allowed characters in variable name following that position 
) 

Regex Demo

String line = "(rate:real;interest,principal:real)"; 
String pattern = "((?<=[\\(,;])[A-Za-z_]\\w*)"; 

Pattern r = Pattern.compile(pattern); 
Matcher m = r.matcher(line); 

while (m.find()) { 
    System.out.println(m.group(1)); 
} 

Ideone Demo

+0

Спасибо! это то, что мне нужно. – LismUK

1

Вот один из способов сделать это с относительно простым регулярным выражением:

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class RegexTest { 

    public static void main(String[] args) { 
     String simple = "(rate:real;interest,principal:real)"; 
     String regex = "(\\w+:|\\w+,)"; 

     Pattern p = Pattern.compile(regex); 
     Matcher m = p.matcher(simple); 

     while (m.find()) { 
      System.out.println(m.group().substring(0, m.group().length() - 1)); 
     } 
    } 
} 

Я боюсь, что я не знаю паскаль, но мне кажется, что имена вы после либо заканчиваться двоеточием или запятой , Регулярное выражение ищет эти строки, а затем удаляет последний символ (двоеточие или запятую).

Выход я получил от тестового прогона было:

rate 
interest 
principal 

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

  • Нет связанных вопросов^_^