2016-03-16 2 views
-1

Метода фильтрации Карты, где регулярное выражение ($) подобрано:

public Map getVariables(Map<String , String> nvp){ 

     Map map = nvp.entrySet().parallelStream() 
       .filter(e -> e.getKey().matches("(($.*?))")) 
       .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); 

     return map; 

    } 

Setup карту, которая содержит ключ/значение «($ тест)», «тест-значение»:

private Map<String , String> nvp = new HashMap<String , String>(); 
public void setup(){ 
    nvp.put("($test)", "test value"); 
} 

Добавьте метод, чтобы проверить, что «($ тест)» содержится в карте возвратятся

public void testGetVariables(){ 

    OpDocVariableInsert o = new OpDocVariableInsert(); 
    System.out.println(o.getVariables(nvp).size()); 
} 

Но 0 результаты возврата редактор Я думаю, что мое регулярное выражение неверно?

+1

'$' имеет особое значение в регулярном выражении, вы должны избежать его: '\\ $'. Также обратите внимание, что вам следует избегать '(' и ')', если вы не хотели захватить матч. – Maroun

+0

Примечание '\\ (\\ $ [^)] ++ \\)' будет более эффективным шаблоном, чем использование ленивого '.'. –

ответ

2

$ и () имеют специальное значение в регулярных выражениях и должны быть экранированы, чтобы соответствовать их оригинальным персонажам:

\\(\\$.*?\\) 
+0

Или используя причудливый 'Pattern.quote'. – Maroun

+1

@MarounMaroun тоже моя первая мысль - не будет работать все-в-одном из-за '. *?'. Использование двух 'Pattern.quote' и concatting кажется немного уродливым ... –

+0

@BoristheSpider Пропустил это .. уверен, в этом случае цитата лучше. – Maroun

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