Шаблон регулярного выражения для строки, не ограниченной символом

Мне нужен шаблон Java для строки, не ограниченной символом.

У меня есть строка (как указано ниже) с некоторыми фигурными скобками, ограниченными одинарными кавычками, и другими фигурными скобками, которых нет. Я хочу заменить фигурные скобки, не заключенные в одинарные кавычки, другой строкой.

Исходная строка:

this is single-quoted curly '{'something'}' and this is {not} end

Необходимо преобразовать в

this is single-quoted curly '{'something'}' and this is <<not>> end

Обратите внимание, что фигурные скобки { }, не заключенные в одинарные кавычки, заменены на ‹‹ >>.

Однако мой код печатает (символ съедается) текст как

this is single-quoted curly '{'something'}' and this is<<no>> end

когда я использую шаблон

[^']([{}])

Мой код

String regex = "[^']([{}])";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);

while (matcher.find()) {
    if ( "{".equals(matcher.group(1)) ) {
        matcher.appendReplacement(strBuffer, "&lt;&lt;");
    } else if ( "}".equals(matcher.group(1))) {
        matcher.appendReplacement(strBuffer, "&gt;&gt;");
    }
}
matcher.appendTail(strBuffer);

person Jyahoo Test    schedule 16.01.2013    source источник


Ответы (3)


Это очевидный пример использования утверждений нулевой ширины. Необходимое регулярное выражение не очень сложное:

String 
   input = "this is single-quoted curly '{'something'}' and this is {not} end",
  output = "this is single-quoted curly '{'something'}' and this is <<not>> end";
System.out.println(input.replaceAll("(?<!')\\{(.*?)\\}(?!')", "<<$1>>")
                        .equals(output));

отпечатки

true
person Marko Topolnik    schedule 16.01.2013
comment
+1, спасибо, что указали на недостаток в моем (теперь удаленном) ответе. - person jlordo; 16.01.2013
comment
Большое спасибо, это было полезно - person Jyahoo Test; 17.01.2013
comment
Извините, все, не могу проголосовать за ответы (говорит... недостаточно репутации). Ответили Да на вопрос Был ли этот пост полезен для вас? вопрос. - person Jyahoo Test; 17.01.2013

Используйте отрицательные конструкции просмотра вперед и назад из раздел специальных конструкций в Java Pattern документация.

person Sean Patrick Floyd    schedule 16.01.2013
comment
Один из более простых способов — использовать группу захвата и обратную ссылку в строке замены. - person nhahtdh; 16.01.2013
comment
@nhahtdh да, но я бы не назвал это проще, я бы назвал это грязнее. Мне нравится помещать все сопоставления с образцом в образец, если это возможно, а не в логику обработки. - person Sean Patrick Floyd; 16.01.2013
comment
Это проще (в кавычках), так как это может относиться не ко всем. Конечно, лично я бы использовал осмотр. - person nhahtdh; 16.01.2013

Попробуй это :

String regex = "([^'])([{}])";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(str);

    while (matcher.find()) {
        if ("{".equals(matcher.group(2))) {
            matcher.appendReplacement(strBuffer, matcher.group(1) + "<<");
        } else if ("}".equals(matcher.group(2))) {
            matcher.appendReplacement(strBuffer,matcher.group(1) + ">>");
        }
    }
    matcher.appendTail(strBuffer);
person Rajat Garg    schedule 16.01.2013
comment
Спасибо за исправление. Я пробовал несколько регулярных выражений безуспешно, но это здорово. :) - person Jyahoo Test; 17.01.2013