1

我的数据如下:

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


        }

但是上面的例子失败了,例如二和三,因为这些值没有“<”和“>”?

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

4

3 回答 3

1

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

于 2013-09-04T22:24:47.600 回答
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"}
        };
    }

}
于 2013-09-04T22:46:33.530 回答
1

既然你说“值不能有空格”,你应该能够对String.replaceAll括号字符执行 a 以将它们更改为空字符串。然后String.split在空白处。你的钥匙是一切,但最后一块。你的价值是最后一块。

于 2013-09-04T22:55:06.090 回答