我正在尝试读取文件并仅在括号中查找数值。所以这方面的一个例子是:
(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());
它不会继续使用代码。我开始认为这是我的正则表达式的一个问题,但我不确定。有人能告诉我我的模式是否正确吗?
答案 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]