2015-02-11 3 views
3

Я пытаюсь получить «тизер» данной строки и поместить ее как значение в HashMap. С «тизером» я подразумеваю подстроку (макс. Длина 50 символов), заканчивающую границу слова.Java-матчер не находит совпадения, хотя регулярное выражение работает отдельно

Вот пример кода, показывающий, как я пытаюсь сделать это:

import java.util.regex.*;    

public class Test {      
    public static void main(String[] args) throws Exception { 
    final Pattern pattern = Pattern.compile("(^.{0,50}\b)"); 
    final Matcher m = pattern.matcher(
     "This is a long string that I want to find a shorter teaser for."); 
    if (m.find()) { 
     System.out.println("Found: " + m.group(1)); 
    } else { 
     System.out.println("No match"); 
    }               
    }    
}  

Я ожидал, что это печать:

Found: This is a long string that I want to find a 

Но вместо этого она печатает:

No match 

Если я тестирую это регулярное выражение отдельно, он делает то, что ему нужно, - он находит подстроку значения, которая имеет максимальную длину 50 символов и nd заканчивается на границе слова. Но если я его отлаживаю, m.find всегда получает меня ложным.

Любые идеи, как это решить? (Я сосредоточен на получении тизера, а не на использовании Matcher.find() ;-))

+5

Использование: 'Pattern.compile (" (^ . {0,50} \\ b) ")' – anubhava

+0

Наряду с тем, что сказал Анубхава, объявите свой шаблон.compile вне вашего цикла. Вам не нужно создавать их каждый раз. – minion

+0

И THX для этого тоже .. Получил это из всех циклов. – anna

ответ

3

Согласно Oracle documentation on Characters \ b - это escape-последовательность для backspace внутри строки. Однако вы хотите \ б регулярного выражения для границы слова, так что вы должны изменить слэш буквальных косых черт, т.е. \\ так что Pattern.compile видит \ б

Pattern.compile("(^.{0,50}\\b)") 

Вы можете увидеть этот эффект, вызвав .toCharArray() на строку

Single слэш

System.out.println(Arrays.toString("\b".toCharArray())); 
=> [] 

Двойной слэш

System.out.println(Arrays.toString("\\b".toCharArray())); 
=> [\, b] 
+0

D'oh! Большое спасибо, второй косой черт был не хватает .. Работает отлично! – anna