2015-01-31 3 views
0

Я хочу разделить ширину и высоту от этой строкиJava регулярные выражения Захват группы

String imgStyle = "width: 300px; height: 295px;"; 
int width = 300; // i want to get this value 
int height = 295; // i want to get this value 

Я попытался много регулярных выражений, но я не могу получить их.

String imgStyle = "width: 300px; height: 295px;"; 

int imgHeight = 0; 
int imgWidth = 0; 

Pattern h = Pattern.compile("height:([0-9]*);"); 
Pattern w = Pattern.compile("width:([0-9]*);"); 

Matcher m1 = h.matcher(imgStyle); 
Matcher m2 = w.matcher(imgStyle); 

if (m1.find()) { 
    imgHeight = Integer.parseInt(m1.group(2)); 
} 

if (m2.find()) { 
    imgWidth = Integer.parseInt(m2.group(2)); 
} 

java.lang.IllegalStateException: Нет успешный матч до сих пор

+1

'Я пробовал много регулярных выражений, но я не могу получить them' Пожалуйста, оставьте свои попытки, так что мы можем их увидеть и сказать вам, что не так – BackSlash

ответ

1

Попробуйте что-то вроде:

String imgStyle = "width: 300px; height: 295px;"; 
Pattern pattern = Pattern.compile("width:\\s+(\\d+)px;\\s+height:\\s+(\\d+)px;"); 
Matcher m = pattern.matcher(imgStyle); 
if (m.find()) { 
    System.out.println("width is " + m.group(1)); 
    System.out.println("height is " + m.group(2)); 
} 
+0

Это работает, спасибо за помощь –

+0

Добро пожаловать. – SMA

0

Узор неправильно:

Pattern h = Pattern.compile("height:([0-9]*);"); 
Pattern w = Pattern.compile("width:([0-9]*);"); 

В вашей строке есть пробел между двоеточием и числом, и вы также px перед точкой с запятой, поэтому она должна быть:

Pattern h = Pattern.compile("height: ([0-9]*)px;"); 
Pattern w = Pattern.compile("width: ([0-9]*)px;"); 

Или лучше:

Pattern h = Pattern.compile("height:\\s+(\\d+)px;"); 
Pattern w = Pattern.compile("width:\\s+(\\d+)px;"); 

Вы также должны захватить группу 1, а не группа 2:

if (m1.find()) { 
    imgHeight = Integer.parseInt(m1.group(1)); 
} 

if (m2.find()) { 
    imgWidth = Integer.parseInt(m2.group(1)); 
} 

DEMO

1

В простейшем случае:

public static void main(String[] args) { 
    final String imgStyle = "width: 300px; height: 295px;"; 
    final Pattern pattern = Pattern.compile("width: (?<width>\\d++)px; height: (?<height>\\d++)px;"); 
    final Matcher matcher = pattern.matcher(imgStyle); 
    if (matcher.matches()) { 
     System.out.println(matcher.group("width")); 
     System.out.println(matcher.group("height")); 
    } 
} 

Просто замените номер детали с (\\d++) - т.е. совпадение и запись цифр.

Я использую названные группы для ясности.

+0

Почему '\\ d ++' вместо '\\ d +'? –

+0

@RaviThapliyal это [владелец] (http://www.regular-expressions.info/possessive.html). Предотвращает откат. –

+0

Ах, хорошо читать. Итак, чем дольше матч, тем больше производительность ударяется по любому возврату. +1. –

0

Просто добавьте пространство перед цифрами:

Pattern h = Pattern.compile("height:\\s*([0-9]+)"); 
Pattern w = Pattern.compile("width:\\s*([0-9]+)"); 
Смежные вопросы