2013-04-14 2 views
0

Я пытаюсь изменить свой разделитель регулярных выражений.Как совместить все до последнего появления специального набора символов?

Мое выражение просто: соответствует один или несколько вхождений из CharacterSet: \s*[|()!=\s]+

Бегущий по этому примеру даст:

(output !==(not output)) | (output) 
//output, not output, output 

Теперь я хочу следующее: «если = персонаж встречается,, затем за спиной все позади до последнего появления снова того же набора символов ».

Опять же, глядя на пример выше, он может увидеть первый =, и должен тогда соответствовать следующим полностью: !==(not output)) | (

Как это можно сделать?

+0

Почему должны идти только на '(' и не вплоть до ')' (что на самом деле является последним вхождением одного из заданных символов)? –

+0

Ну, это всего лишь пример. Все, что я хочу достичь, - это, как написано выше: «если возникает символ' = ', тогда сопоставьте все позади до последнего появления снова одного и того же набора символов». Так что он принимает целую строку '= (not output)) | (' – membersound

+0

Небольшое улучшение: в' \ s * [|()! = \ S] + 'вам не нужно' \ s * 'при запуске, так как оно уже включено в' [|()! = \ S] 'Может быть, вы хотели' \ s + '? – Pshemo

ответ

0

Я не уверен, если это то, что вы имеете в виду для дальнейшего использования, но для текущего входа работает

String data = "(output !==(not output)) | (output)"; 
Matcher m = Pattern.compile("(\\w+)\\s*(?=!?==)(.*)\\1").matcher(data); 
//       ^-group1  ^ ^-repeated group1 
//            |group 2 
while (m.find()) { 
    System.out.println(m.group(2));//match from group 2 
} 

выход:

!==(not output)) | (
Смежные вопросы