使用Java从格式化字符串中提取

时间:2014-11-26 16:07:52

标签: java regex string parsing

我有以下格式的字符串:

  • [(xx)(KEY1)some text]
  • 有些文字[(yy)(KEY1)有些文字]
  • 一些文字[(qq)(KEY1)一些文字]这里有更多文字[(zz)(KEY2)一些文字]等。

基本上, [(xx)(KEYX)some text] 形式在与其他字符混合的字符串中出现一次或多次。

在上面的格式中,键是 KEYX ,值是一些文本

我想从包含任意数量此类格式的任何字符串中提取所有键值对。

我尝试使用子字符串等直接解析,但这似乎不是一个干净的解决方案。是否可以使用正则表达式或Java提供的任何其他技术更好地做到这一点?

2 个答案:

答案 0 :(得分:1)

您可以使用正则表达式和匹配器来查找您的密钥和值:

     public static void main(String[] args) throws IOException
     {
         String test = "[(xx)(KEYX)some text]";
         Pattern pattern = Pattern.compile("\\(KEY.*\\)");

         Matcher matcher = pattern.matcher(test);
         matcher.find();
         String s = matcher.group(0);
         String s1 = test.substring(matcher.end(), test.length() - 1);
         System.out.println("" + s + "   " + s1);

     }

输出结果如下:

(KEYX)   some text

如果您将字符串更改为"[(xx)(KEYXYYYYYY)some text]",那么它将是:

(KEYXYYYYYY)   some text

如果您不想在键周围使用括号:

 public static void main(String[] args) throws IOException
 {
     String test = "[(xx)(KEYXYYYYYY)some text]";
     Pattern pattern = Pattern.compile("(?<=\\()KEY.*(?=\\))");

     Matcher matcher = pattern.matcher(test);
     matcher.find();
     String s = matcher.group(0);
     String s1 = test.substring(matcher.end() + 1, test.length() - 1);
     System.out.println("" + s + "   " + s1);

 }

输出将是:

KEYXYYYYYY   some text

*************** *************** UPDATE ********************************** ************************ 匹配任何关键不仅仅是KEY:

 public static void main(String[] args) throws IOException
 {
     String test = "[(xx)(time.zone1)some text]";
     Pattern pattern = Pattern.compile("(?<=\\()[^xy].*(?=\\))");

     Matcher matcher = pattern.matcher(test);
     matcher.find();
     String s = matcher.group(0);
     String s1 = test.substring(matcher.end() + 1, test.length() - 1);
     System.out.println("" + s + "   " + s1);

 }

这将输出:

time.zone1   some text

*************** *********** UPDATE ************************************** ********

相同字符串中的多个匹配项:

 public static void main(String[] args) throws IOException
 {
     String test = "[(xx)(time1.zone1)some text1]blahblahblah[(xx)(time2.zone2)some text2]";
     Pattern pattern = Pattern.compile("(?<=\\()[^xy].*?]");

     Matcher matcher = pattern.matcher(test);
     while(matcher.find())
     {
         String s = matcher.group(0);
         String s1 = s.substring((s.indexOf(")") + 1), (s.length() - 1));
         s = s.substring(0, s.indexOf(")"));
         System.out.println("" + s + "   " + s1);
     }

 }

这将输出:

time1.zone1   some text1
time2.zone2   some text2

答案 1 :(得分:0)

如果我理解你的问题,你可以依靠KEY从第四个角色开始,然后找到下一个&#34;)&#34;像

String str = "(xx)(KEY1)some text";
int open = str.indexOf("(", 4);
int pos = str.indexOf(")", 4);
str = str.substring(open + 1, pos);
System.out.println(str);

输出

KEY1