2016-02-10 3 views
2

Мне нужно использовать регулярное выражение для следующего текста. Скобки не вложены.Регулярное выражение для текста между последними действительными скобками

{ ... bla ... {text} jdjdj ... { kdkdkdkd aaa { abc } 

, если я использую \{(.*?)\} то есть две группы:

... bla ... {text 
kdkdkdkd aaa { abc 

Но мне нужно

text 
abc 

Можно ли написать такой Regex в Java?

EDIT: Реально скобка являются @{ и }@~enc~

Фактическая строка:

@{ ... bla ... @{text}@~enc~ jdjdj ... @{ kdkdkdkd aaa @{ abc }@~enc~ 

ответ

3

Случай 1. Односимвольные разделителей

Вы должны использовать negated character class[^{}]:

\{([^{}]*)} 

Класс символов [^{}] соответствует любому персонажу, но { и }.

Java demo:

String s = "{ ... bla ... {text} jdjdj ... { kdkdkdkd aaa { abc }"; 
Pattern pattern = Pattern.compile("\\{([^{}]*)}"); 
Matcher matcher = pattern.matcher(s); 
while (matcher.find()){ 
    System.out.println(matcher.group(1).trim()); 
} 

Обратите внимание, что вы можете использовать String#trim(), чтобы избавиться от задней/ведущие пробелы в ваших захватах.

Случая 2. Multi-символы разделители

Для сопоставления текста между несколькими символами разделителями, вы можете использовать tempered greedy token:

Pattern pattern = Pattern.compile("(?s)@\\{((?:([email protected]\\{|}@~enc~).)*)}@~enc~"); 
              ^^^^^^^^^^^^^^^^^^^^^^ 

См another demo. Модификатор (?s) (равный установке флага Pattern.DOTALL) также соответствует символам новой строки ..

NB: Не забудьте избежать символа { в регулярном выражении Java, и вам не обязательно избегать }.

+0

['{\ s * ([^ {}] *?) \ S *}'] (https://regex101.com/r/yQ6aX0/1), если OP не хочет пробелов в совпадениях. – Tushar

+1

@Tushar: Я верю в Java, все в порядке, просто используйте 'trim()'. –

+0

Да, это то, что я искал. ['trim()'] (https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#trim()) – Tushar

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