【问题标题】:Java regex: how to reduce sequence of same character of a unity?Java regex:如何减少同一字符的统一序列?
【发布时间】:2017-03-15 23:08:52
【问题描述】:

我想在字符串中将每个括号序列替换为长度小一的括号序列。 这是一个可能的输入:

String toBeParsed = "src:expr[src:call[src:name[src:name='m']]]]" +        
    "[src:call[src:name[src:operator='.']]]]" +
    "[src:call[src:name[src:name='getDisplayFormat']]]]" +
    "[src:call[src:argument_list='()']]][src:operator='instanceof']]" +
    "[src:name='MathFormat']]";

这是愿望输出:

String result = "src:expr[src:call[src:name[src:name='m']]]" +        
    "[src:call[src:name[src:operator='.']]]" +
    "[src:call[src:name[src:name='getDisplayFormat']]]" +
    "[src:call[src:argument_list='()']][src:operator='instanceof']" +
    "[src:name='MathFormat']";

我曾尝试使用 Java 类来执行此操作,但它在两个循环后停止删除括号:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class SequenceCutter{
    public static void main(String[] args){
        String toBeParsed = "src:expr[src:call[src:name[src:name='m']]]]" + 
            "[src:call[src:name[src:operator='.']]]]" +
            "[src:call[src:name[src:name='getDisplayFormat']]]]" +
            "[src:call[src:argument_list='()']]][src:operator='instanceof']]" +
            "[src:name='MathFormat']]";
        Matcher bracketsMatch;
        int subIndex = 0;
        String oldString;
        do {
            bracketsMatch = Pattern.compile("\\]+").
                matcher(toBeParsed.substring(subIndex));
            if (!bracketsMatch.find())
                break;
            subIndex = bracketsMatch.end();
            String match = bracketsMatch.group();
            oldString = toBeParsed;
            toBeParsed = toBeParsed.substring(0, subIndex)
                .replace(match, match.substring(1)) + toBeParsed.substring(subIndex);
        } while (bracketsMatch.find() && !oldString.equals(toBeParsed));
        System.out.println("Result: " + toBeParsed);
    }
}

我想我正在以一种非常复杂的方式做这件事,但我无法找到另一种解决方案。 感谢任何愿意帮助我的人。

【问题讨论】:

标签: java regex


【解决方案1】:

如果您需要用相同的序列减去 1 ] 替换任何 2+ ] 符号序列,您可以使用

String toBeParsed = "src:expr[src:call[src:name[src:name='m']]]]" +        
        "[src:call[src:name[src:operator='.']]]]" +
        "[src:call[src:name[src:name='getDisplayFormat']]]]" +
        "[src:call[src:argument_list='()']]][src:operator='instanceof']]" +
        "[src:name='MathFormat']]";
System.out.println(toBeParsed.replaceAll("(]+)]", "$1"));

请参阅Java demo

"(]+)]" 模式将匹配并捕获两个或更多] 符号,并将除最后一个之外的所有符号放入捕获组。然后,除最后一个之外的所有内容都将使用$1 反向引用返回结果中。

【讨论】:

  • 我曾尝试与replaceAll 合作,但做了一些被禁止的事情,例如:toBeParsed.replaceAll("(]+)", "$1".substring(1))。非常感谢。
  • "$1" 是一个字符串文字。只有在找到匹配项时,正则表达式引擎才会用捕获组值填充它。你应该使用我的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-01
  • 1970-01-01
  • 2011-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多