Я пытаюсь сопоставить и записать команду и параметры из следующего ввода:

!command param1 param2

Я использую классы Java Pattern и Matcher:

private Pattern regExp = Pattern.compile(
        "^!(?<command>[^\\s]*)((?:\\s+)(?<param>[^\\s]*))*$");

public String command() {
    m = regExp.matcher(getMsg());
    return m.matches() ? m.group("command") : "";
}

public String param(int index) {
    return m.group(index);
}

Также используя это (http://fiddle.re/yanta6) для экспериментов ....

Некоторый указатель и помощь оценены!

3
KarlOve Karlsson 22 Дек 2014 в 14:33
Так какой у тебя вопрос? Ваш узор выглядит нормально.
 – 
aioobe
22 Дек 2014 в 14:37
2
В вашем заголовке написано "разделить пространство". Пробовали разбивать по пробелам? Что касается вашего вопроса, вы можете захватить только последний <param>. Этот вопрос, вероятно, является дубликатом: Регулярное выражение - захват всех повторяющихся групп
 – 
Kobi
22 Дек 2014 в 14:39
1
Обратите внимание, что у вас не может быть переменного количества групп захвата: stackoverflow.com/questions/5018487/… Вам нужно будет сопоставить всю подстроку параметров, а затем разделить это совпадение на пробел или что-то еще.
 – 
aioobe
22 Дек 2014 в 14:41
 – 
msrd0
22 Дек 2014 в 14:47
Каков ваш ожидаемый результат? Вы можете сделать это только с помощью регулярного выражения...
 – 
Avinash Raj
22 Дек 2014 в 15:05

2 ответа

Лучший ответ

Лично я бы не стал использовать для этого регулярное выражение. Если ваш ввод

!command param1 param2 paramX

Тогда обычное манипулирование строкой отлично справится с этой задачей. Просто откажитесь от открытия! а затем используйте разделение на ""

5
tddmonkey 22 Дек 2014 в 14:42
Достаточно честно, это сработает, но даже если бы я не упомянул об этом, мне нужно будет сделать это несколько конфигурируемым, что предпочтительнее для тех, кто лучше меня разбирается в регулярных выражениях :)
 – 
KarlOve Karlsson
23 Дек 2014 в 14:10
Params.addAll(Arrays.asList(getMsg().split("\\s+")));
 – 
KarlOve Karlsson
23 Дек 2014 в 14:13

Вы можете сделать это с помощью регулярного выражения ..

Pattern pattern = Pattern.compile("(?:^!(?<Command>\\S+)|)\\s+(?<params>\\S+)");
String input = "!command param1 param2 param3 paramn param3 param4";
Matcher matcher = pattern.matcher(input);
while(matcher.find())
{
    if(matcher.group("Command") != null)
    {
    System.out.println(matcher.group("Command"));
    }
    if(matcher.group("params") != null)

    System.out.println(matcher.group("params"));
}

Выход:

command
param1
param2
param3
paramn
param3
param4

ДЕМО

2
Avinash Raj 22 Дек 2014 в 15:21