1

对于不受字符限制的字符串,我需要 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);
4

3 回答 3

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
于 2013-01-16T08:53:34.950 回答
1

使用Java文档的特殊构造部分中的否定前瞻/后瞻构造。Pattern

于 2013-01-16T08:36:46.623 回答
0

试试这个 :

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);
于 2013-01-16T08:51:41.870 回答