用Java重新编写(\ d {4},\ d {4})

时间:2015-03-11 21:56:13

标签: java regex

我正在尝试读取文件并仅在括号中查找数值。所以这方面的一个例子是:

(0000,0002)
(0000,0003)
(0002,0005)

我创建了一个正则表达式,将在java中搜索它,如下所示:

public String matchDICOMTags = "^[(][\\d{4},][\\d{4}][)]$";
public Pattern pattern = Pattern.compile(matchDICOMTags);

但是在我的方法中,当谈到这行代码时:

        Matcher m = pattern.matcher(dcmObj.toString());

它不会继续使用代码。我开始认为这是我的正则表达式的一个问题,但我不确定。有人能告诉我我的模式是否正确吗?

2 个答案:

答案 0 :(得分:3)

数字的\ d {4}模式不应该在[]内,因为这会导致它们是文字匹配。另外我相信^和$标记不是必需的,它可以使用或不使用它们。此外,不需要在[]块内。

将它们移到外面

"[(]\\d{4},\\d{4}[)]";

测试

String test = "other stuff (0000,0002) foo \n(0000,0003) bar \n(0002,0005)baz";
Pattern pattern = Pattern.compile("[(](\\d{4}),(\\d{4})[)]");
Matcher matcher = pattern.matcher(test);
while (matcher.find()) {
    System.out.println(String.format("(%s,%s)", matcher.group(1), matcher.group(2)));
}

输出

(0000,0002)
(0000,0003)
(0002,0005)

答案 1 :(得分:1)

这是获得String[]对列表的单行:

List<String[]> pairs = Arrays.stream(input.split("[\n\r]+"))
        .map(s -> s.replaceAll(".*\\((\\d{4},\\d{4})\\).*", "$1"))
        .filter(s -> s.length() == 9)
        .map(s -> s.split(","))
        .collect(Collectors.toList());

一些测试代码:

String input = "foo(0000,0002)bar\n(0003,0004) bar\nfoo(0005,0006)";
Arrays.stream(input.split("[\n\r]+"))
        .map(s -> s.replaceAll(".*\\((\\d{4},\\d{4})\\).*", "$1"))
        .filter(s -> s.length() == 9)
        .map(s -> s.split(","))
        .map(Arrays::toString)
        .forEach(System.out::println);

输出:

[0000, 0002]
[0003, 0004]
[0005, 0006]