2014-09-20 72 views
0

我有一个String的路由项:解析字符串与正则表达式

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

该字符串将在自己的行中与其他非有趣的文本[所以我不能只使用String.split(" ");]。我打算使用regexPattern s到它弄出来使用:

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

进出口新到Java regex,并可能与一些帮助做,

如何使用Pattern到单独的这个String到它的组件?


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

key public direct routing.key; 
key direct routingkey; 
+0

等等,问题是如何使用正则表达式来查找文件中的行或如何使用正则表达式将行分割成您必须存储的组件?如果后者 - 为什么使用正则表达式? – Fildor 2014-09-20 14:17:51

+1

“该字符串将在其他文件中的其他非有趣的文字自己的行[所以我不能只使用String.split(”“);]”这我觉得矛盾。如果字符串是在它自己的文本行中,为什么不能在“”上分割? – Fildor 2014-09-20 14:19:48

+0

@Fildor这两个,我用正则表达式作为在文件的其余部分非有趣的文字可能包含单词键等 – Edd 2014-09-20 14:20:41

回答

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

这里你想要的一个简单的示例:

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); 
     } 
    } 
} 
2

试试这个:

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

见Debuggex流程图了解它是如何工作的。修饰符将位于组1中,路由键将位于组2中。您可以使用MatchResult.group(number))从匹配结果中提取组。

Regular expression visualization

Debuggex Demo