我有一个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;
答案 0 :(得分:3)
使用capturing-group。在这里我捕捉你的修饰符和键,看看这个正则表达式匹配:
^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));
}
答案 1 :(得分:2)
试试这个:
key(?: (.*))? (.+);
请参阅Debuggex流程图以了解其工作原理。修饰符将位于组1中,路由键将位于组2中。您可以使用MatchResult.group(number))
从匹配结果中提取组。
答案 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);
}
}
}