Поиск строк в многострочной строке с регулярным выражением и Java

2

Меня сильно беспокоит синтаксис Java для регулярного выражения... Вот моя (многострочная) строка:

2054:(0020,0032) DS #36 [-249.28170196281\-249.28170196281\0] Image Position (
2098:(0020,0037) DS #12 [1\0\0\0\1\0] Image Orientation (Patient)
2118:(0020,0052) UI #52 [1.3.12.2.11...5.2.30.25....2.20....0.0.0]
2178:(0020,1040) LO #0 [] Position Reference Indicator
2222:(0028,0004) CS #12 [MONOCHROME2] Photometric Interpretation
2242:(0028,0010) US #2 [256] Rows
2252:(0028,0011) US #2 [256] Columns
2262:(0028,0030) DS #18 [1.953125\1.953125] Pixel Spacing
2288:(0028,0100) US #2 [16] Bits Allocated
2298:(0028,0101) US #2 [12] Bits Stored
2352:(0028,1055) LO #6 [Algo1] Window Center & Width Explanation

Мне нужно 1.953125 и 1.953125 from DS #18 [1.953125\1.953125] Pixel Spacing

Я пробовал это:

Pattern p = Pattern.compile("DS #18 \\[([0-9\\.]*)\\\\([0-9\\.]*)\\] Pixel Spacing"); // os is my string above
System.out.println(m.matches()); // false =(

но без успеха. Есть идеи? "Pattern.MULTILINE" ничего не меняет.

Спасибо!

Теги:

1 ответ

4
Лучший ответ

Если вы пытаетесь извлечь несколько вхождений из строки ввода, вы не можете использовать метод matches(), поскольку он будет пытаться сопоставить весь ввод. Таким образом, для нескольких вхождений:

Pattern p = Pattern.compile("DS \\#18 \\[([0-9\\.]*)\\\\([0-9\\.]*)\\] Pixel Spacing",
                            Pattern.MULTILINE|Pattern.DOTALL); 
Matcher m = p.matcher( input );
while( m.find() ) {
    System.out.println("[ "+m.group( 1 )+", "+m.group( 2 )+" ]");
}

Если вам нужно одно вхождение, вам нужно добавить. * в начале и конце вашего шаблона:

Pattern p = Pattern.compile(".*DS \\#18 \\[([0-9\\.]*)\\\\([0-9\\.]*)\\] Pixel Spacing.*",
                            Pattern.MULTILINE|Pattern.DOTALL); 
System.out.println(m.matches());

Эдсон

  • 0
    Это отлично работает, большое спасибо!
  • 0
    К вашему сведению, модификаторы MULTILINE и DOTALL не нужны. MULTILINE изменяет значение якорей ( ^ и $ ), а DOTALL изменяет значение точки ( . ). Поскольку вы не используете точку в качестве метасимвола и вообще не используете якоря, ни один из этих модификаторов не имеет значения.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню