Меня сильно беспокоит синтаксис 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" ничего не меняет.
Спасибо!
Если вы пытаетесь извлечь несколько вхождений из строки ввода, вы не можете использовать метод 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());
Эдсон
^
и$
), а DOTALL изменяет значение точки (.
). Поскольку вы не используете точку в качестве метасимвола и вообще не используете якоря, ни один из этих модификаторов не имеет значения.