2015-07-25 7 views
1

Я пытаюсь использовать регулярное выражение с отрицательным взглядом и группами. К сожалению, он работает не так, как ожидалось, поэтому мне нужна помощь.regexp negative lookahead с группами

Мне нужно разобрать размеры (дюймы) в конце строки, которая может быть форматом «Tony Hawk 39.75» -> 39.75 "или с длиной x width 'Tony Hawk 39.75" x 8.75 " '-> 9,75 "x 8,75". Проблема в том, что имя также может содержать числа, например. «AD-37 8.0», поэтому я попытался с отрицательным взглядом, что «пространство» не следует за «x» (?!. + \ S [x]), но оно возвращается со странным результатом.

Pattern regex = Pattern.compile("(?!.+\\s[x])\\s(\\d+\\.?\\d*\".*)"); 
String s = "Tony Hawk 39.75\" x 8.75\""; 
// or String s = "AD-37 8.0\""; 
Matcher m = regex.matcher(s); 
if (m.find()) { 
    System.out.println(m.groupCount()); 
    System.out.println(m.group(1)); 
    System.out.println(m.group(2)); 
} 

Когда я выполняю приведенный выше пример, он возвращает меня для группы 1 '8.75 ", что я не понимаю. Здесь я бы ожидал «Тони Хок».

Какие-либо намеки, что я сделал не так?

+0

Что ваш код предполагают достичь? Какова ваша цель? – Pshemo

ответ

1

Использование шаблона:

(.+?)\\s(\\d+\\.\\d*\".*) 

может дать лучшие результаты:

2 
Tony Hawk 
39.75" x 8.75" 

Пример:

https://regex101.com/r/pN0fW1/1

+0

Спасибо, что сработали! Иногда решение так просто;) Могу ли я спросить, что '(. +?)' Делает? thx – megloff

+0

'(. +?)' определяет (ленивую) группу захвата, которая соответствует любому символу (кроме новой строки), между одним и неограниченным временем, расширяя по мере необходимости. Добавляя '?' После '+', мы говорим ему, чтобы он повторялся как можно несколько раз, поэтому, когда он встречается с остальной частью матча, он перестает захватывать эту часть. –

 Смежные вопросы

  • Нет связанных вопросов^_^