用正则表达式解析字符串

时间:2014-09-20 14:12:45

标签: java regex string

我有一个String的路由密钥:

"key modifier path.to.routing.key;"
  • "key"始终存在(我不需要存储此部分)
  • "modifier"(一个单词)可以出现0次或更多次(我需要存储修饰符)
  • "path.to.routing.key"是实际的密钥,并且始终是该行的最后一个组件,后跟“;”可能有0个或更多'。'路由键中的字符但总是至少有1个字(我需要存储此部分)。

字符串将在其他非有趣文本的文件中自行排列[所以我不能使用String.split(" ");]。我打算使用regex Pattern来解决问题:

Pattern p = Pattern.compile("...pattern...");

我是java regex的新手,可以提供一些帮助,

如何使用Pattern将此String分隔到其组件中?


一些例子,如果它有帮助:

key public direct routing.key;
key direct routingkey;

3 个答案:

答案 0 :(得分:3)

使用。在这里我捕捉你的修饰符和键,看看这个正则表达式匹配:

^key (\w+(?: \w+)*) ([\w.]++);$
MATCH 1: [Group 1: public direct] [Group 2: routing.key]
MATCH 2: [Group 1: direct] [Group 2: routingkey]

这是regex demo

然后,您可以使用.split(" ")拆分修改器。


代码:

Pattern pattern = Pattern.compile("^key (\\w+(?: \\w+)*) ([\\w.]++);$", Pattern.MULTILINE);
Matcher matcher = pattern.matcher("key public direct routing.key;\nkey direct routingkey;");
while (matcher.find()) {
    for (final String modifier : matcher.group(1).split(" "))
        System.out.println(modifier);
    System.out.println(matcher.group(2));
}

这是online code demo

答案 1 :(得分:2)

试试这个:

key(?: (.*))? (.+);

请参阅Debuggex流程图以了解其工作原理。修饰符将位于组1中,路由键将位于组2中。您可以使用MatchResult.group(number))从匹配结果中提取组。

Regular expression visualization

Debuggex Demo

答案 2 :(得分:-1)

这是您想要的简单示例:

public static void main(String[] args) {
    Pattern pattern = Pattern.compile("key (?:(.*) )?(.*?);");
    // key, facultative things (group 1), mandatory thing (group 2)

    String[] tests = new String[]{"key public direct routing.key;", "key direct routingkey;", "key nomodifier;"};

    for (String test : tests) {
        System.out.println("test: " + test);

        Matcher matcher = pattern.matcher(test);
        if (matcher.matches()) {
            // split facultative modifiers
            String[] modifiers = matcher.group(1) == null ? new String[0] : matcher.group(1).split(" ");

            // retrieve the mandatory key
            String key = matcher.group(2);

            System.out.println("modifiers: " + Arrays.toString(modifiers) + "; key: " + key);
        }
    }
}