Java使用正则表达式按空格分割字符串?

3

我正在尝试从以下输入中匹配和捕获命令和参数:

!command param1 param2

我正在使用Java的类PatternMatcher

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) 进行实验....

希望能得到指引和帮助!


那你的问题是什么?你的模式看起来没问题。 - aioobe
2
你的标题说“按空格拆分”。你尝试过按空格拆分吗?至于你的问题,你只能捕获最后一个<param>。这个问题可能是重复的:正则表达式-捕获所有重复组 - Kobi
1
请注意,您不能拥有可变数量的捕获组:https://dev59.com/_2445IYBdhLWcg3wIG19 您必须匹配整个params子字符串,然后在空格或其他字符上拆分该匹配。 - aioobe
https://regex101.com/r/nQ9gW0/1 - msrd0
@karl 你期望的输出是什么?你可以只使用正则表达式来实现这个功能。 - Avinash Raj
2个回答

5
个人观点,我不会使用正则表达式处理这个问题。如果你的输入是

开始的HTML标签代码,则可以使用以下方法来提取标签名:
!command param1 param2 paramX

那么普通的字符串操作就可以很好地完成这项工作。只需丢弃开头的“!”,然后在“”上使用拆分函数即可。

好的,那当然可以,但即使我没有提到,我仍需要使其在某种程度上可配置,最好由比我更擅长正则表达式的人来完成 :) - KarlOve Karlsson
params.addAll(Arrays.asList(getMsg().split("\s+"))); - KarlOve Karlsson

2

你可以通过正则表达式实现这一点。

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

DEMO


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接