Шаблон регулярного выражения для вызова функции - PullRequest
3 голосов
/ 15 марта 2012

Я определил следующий шаблон для анализа нашего собственного пользовательского параметра для функции: <functionName>[<arg1>, <arg2>, ..] и шаблон:
([a-zA-Z0-9]+)\\[(([a-zA-Z0-9]+)(,([a-zA-Z0-9])+)*?)*?\\]

Теперь, когда я запускаю это для примера функции: properCase[ARG1,ARG2], я получаю следующий вывод:

Total matches are: 5
Group number 0is: properCase[ARG1, ARG2]
Group number 1is: properCase
Group number 2is: ARG1
Group number 3is: ARG1
Group number 4is: ,ARG2

Код:

        Matcher m = funcPattern.matcher("properCase[ARG1, ARG2]");
        System.out.println("Match found: " + m.matches());
        System.out.println("Total matches are: " + m.groupCount());
        if (m.matches())
        {
            for (int index= 0 ; index < m.groupCount(); index++)
            {
                System.out.println("Group number "+ index + "is: " +m.group(index));
            }
        }

Как я могу извлечь только имя функции (как группа 1) и список аргументов (как группа 2, группа 3)? Я не могу исключить , из группы.

Ответы [ 2 ]

2 голосов
/ 15 марта 2012

Я не могу использовать предоставленное вами регулярное выражение для соответствия properCase[ARG1, ARG2], но чтобы ответить на ваш вопрос в более общем плане, вы должны использовать группы без захвата (?:your_regex), чтобы не включать его в группы соответствия

РЕДАКТИРОВАТЬ:

Если вы не состоите в браке с использованием одного регулярного выражения для анализа, рассмотрите следующее: разделите строку на группы имени функции и аргументов, а затем разделитегруппа аргументов по разделителю,

import java.util.regex.*
String regex="([a-zA-Z0-9]+)\\[([ ,.a-zA-Z0-9]+)\\]"
Pattern funcPattern = Pattern.compile(regex);
Matcher m = funcPattern.matcher("properCase[ARG1, ARG2, class.otherArg]");
        System.out.println("Match found: " + m.matches());
        System.out.println("Total matches are: " + m.groupCount());
        if (m.matches())
        {
            for (int index= 0 ; index <= m.groupCount(); index++)
            {
                System.out.println("Group number "+ index + "is: " +m.group(index));
            }
        }
println "Arguments: " + m.group(2).split(",");

Производит:

Match found: true
Total matches are: 2
Group number 0is: properCase[ARG1, ARG2, class.otherArg]
Group number 1is: properCase
Group number 2is: ARG1, ARG2, class.otherArg
Arguments: [ARG1,  ARG2,  class.otherArg]
1 голос
/ 15 марта 2012

Заключите запятую в собственную группу, чтобы обойти ее.

([a-zA-Z0-9]+)\\[(([a-zA-Z0-9]+)(,)(([a-zA-Z0-9])+)*?)*?\\]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...