java - 在字符串中多次匹配某个模式

标签 java regex string

目的是通过某种分布函数来替换 double ,即 像这样转换字符串

0.5 * x + 0.5 * y

转换为字符串:

IntPMF[(0;0.5)(1;0.5)] * x + IntPMF[(0;0.5)(1;0.5)] * y

我编写了以下函数:

    public static String replaceDoubles(String stoEx) {
    Pattern p = Pattern.compile("(\\d+(?:\\.[0-9]\\d*))");
    Matcher m = p.matcher(stoEx);
    while (m.find()) {
        double d = Double.parseDouble(m.group(1));
        String dStr = String.valueOf(d);
        String[] parts = dStr.split("\\.");
        int lower = Integer.valueOf(parts[0]);
        int upper = lower + 1;
        double decimalPart = d - lower;
        decimalPart = round(decimalPart, 2);
        double rest = round(1 - decimalPart, 2);
        String replacement = "IntPMF[(" + lower + ";" + rest + ")(" + upper + ";" + decimalPart + ")]";
        stoEx = stoEx.replaceAll(m.group(1), replacement);
    }
    return stoEx;
}

问题是,使用这个函数我得到以下输出(对于上面提到的字符串):

IntPMF[(0;IntPMF[(0;0.5)(1;0.5)])(1;IntPMF[(0;0.5)(1;0.5)])] * x + IntPMF[(0;IntPMF[(0;0.5)(1;0.5)] (1;IntPMF[(0;0.5)(1;0.5)])] * y

double 0.5被替换了好几次......

任何有关解决方案的建议将不胜感激。 谢谢!

最佳答案

如果我正确理解了要求,你可以使用这样的东西。要舍入值并获得解释,建议使用 DecimalFormatter。避免为此使用 JDK 内部库。

public static void main( String[] args )
{
    DecimalFormat df = new DecimalFormat( "0.00" );

    //0.52 -> IntPMF[(0;0.48)(1;0.52)]
    String stoEx = "0.5 * x + 0.32222* y";
    Pattern p = Pattern.compile( "(\\d+\\.\\d+)" );
    Matcher m = p.matcher( stoEx );
    String result = "";
    StringJoiner stringJoiner = new StringJoiner( "+" );
    String[] splitString = stoEx.split( "\\+" );
    for( String subString: splitString )
    {
        if( m.find() )
        {
            String fracPart = m.group( 1 ).split( "\\." )[1];
            String fracOne = df.format( 1 - ( Integer.parseInt( fracPart ) / Math.pow( 10.0, fracPart.length() ) ) );
            String fracTwo = df.format( ( Integer.parseInt( fracPart ) / Math.pow( 10.0, fracPart.length() ) ) );
            String resultEx = "IntPMF[(" + 0 + ";" + fracOne + ")(" + 1 + ";" + fracTwo + ")]";
            result = subString.replaceFirst( m.group( 1 ), resultEx );
            stringJoiner.add( result );
        }
    }
    System.out.println( stringJoiner.toString() );
}

关于java - 在字符串中多次匹配某个模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61503099/

相关文章:

java - 检查字符串中的特定数字 [Java]

Java编程,程序不会把扫描器传到while循环中

java - 输入 "q"后如何完全结束循环?

javascript - 如何在 GWT jsni 中传递类名作为参数并调用常见静态方法?

Javascript - 正则表达式规则,找到 XX 但不在 span 标记中

java - 递归——反转字符串

java - 我怎样才能得到 5 或 10 的下一个最高倍数

javascript - 如何从 json/字符串中删除特殊字符和特定单词?

R从字符串中删除最后一个单词

java - 散列长字符串进行比较还是比较两个字符串更快?