Образец на регулярен израз за низ, който не е ограничен от знак

Имам нужда от 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

Използвайте отрицателните конструкции lookahead / lookbehind от раздел за специални конструкции на 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