在java中解析两种不同模式的好方法

时间:2013-09-04 22:13:30

标签: java

我的数据如下:

key value
<foo.bar> <foo>
<foo bar> foo
<foobar1> foo

我想解析它......

obj.setKey(key);

obj.setValue(value);

现在我如何在一个函数中解析它:

到目前为止我已经。

public void setNTriples(String text){
        Pattern pattern = Pattern.compile("<(.*?)>");
        Matcher matcher = pattern.matcher(text);
        int count = 0;
        while(matcher.find()) {
            if (count == 0){
                setKey(matcher.group(1));
                count +=1;
            }
            else if (count == 1){
                setValue(matcher.group(1));
                count +=1;
            }


        }

但是上面的例子有两个和三个失败,因为这些值没有“&lt;”和“&gt;”在它?

我如何解决这个问题? 感谢

3 个答案:

答案 0 :(得分:1)

对于你的例子,这个似乎是为我选择每个单词:(<[a-zA-Z.\d\s]+>|\w+)。我不知道它是否是最短的。

答案 1 :(得分:1)

以下正则表达式应允许您提取键和值(作为组),因为我假设您要提取键和值而不包含<>

<([^>]*)>\s+[<]?([^>]*)[>]?

这是一个显示结果的TestNG单元测试:

public class RegExTest {

    Pattern p = Pattern.compile("<([^>]*)>\\s+[<]?([^>]*)[>]?");

    @Test(dataProvider = "data")
    public void testRegEx(String line, String k, String v) {
        Matcher m = p.matcher(line);
        if (! m.matches() ) {
            Assert.fail("no match");
        }
        Assert.assertEquals(m.group(1), k);
        Assert.assertEquals(m.group(2), v);
    }

    @DataProvider
    public Object[][] data() {
        return new Object[][] {
                {"<foo.bar> <foo>", "foo.bar", "foo"},
                {"<foo bar> foo", "foo bar", "foo"},
                {"<foobar1> foo", "foobar1", "foo"}
        };
    }

}

答案 2 :(得分:1)

由于你说“值不能有空格”,你应该能够在括号字符上做String.replaceAll来将它们变成空字符串。然后在空格上String.split。除了最后一块,你的关键是一切。你的价值是最后一块。