STRING:用格式化的数字替换模式

时间:2017-03-02 15:22:39

标签: java

我有一个字符串数组,如下所示:

someThing/one_text_0000_temperature****
another/two_text_0000_temperature****
where/three_text_0000_temperature****

我有变步。

int step

我需要用变量步骤中的数字替换那些 ****

步骤为94的输出示例:

someThing/one_text_0000_temperature0094
another/two_text_0000_temperature0094
where/three_text_0000_temperature0094

问题是*的数量正在改变。好吧,当程序运行时,每个字符串都是常量且相同的。但这些字符串来自文件。在下次启动程序时,*的数量可能不同,文件已更改。

我认为我将分三步完成:找到星数,格式化为字符串,最后用新字符串替换部分字符串

问题1) 如何找出星星的数量?

问题2) 如何将步变量格式化为动态长度字符串?不是这样的:

String.format("%04d", step);   // how to change that 4 if needed?
问题3) 如何用另一个字符串替换部分字符串
这可以通过调用replace来完成。不确定line = line.replace()是否有效/正确?

String line = new String("someThing/one_text_0000_temperature****");
String stars = new String("****"); // as result of step 1
String stepString = new String("0094"); // as result of step 2
line = line.replace(stars, stepString);

非常感谢您提供的提示/帮助

被修改

感谢您的灵感。我确实在这里找到了一些更多的想法Simple way to repeat a String in java和我的最终代码:

int kolko = line.length() - line.indexOf("*");
String stars = String.format("%0"+kolko+"d", 0).replace("0", "*");
String stepString = String.format("%0"+kolko+"d", step);

我在HashMap中存储了行,所以我可以使用lambda

lines.replaceAll((k, v) -> v.replace(stars, stepString));

3 个答案:

答案 0 :(得分:1)

首先尝试使用' 0'预先填充字符串,最后添加您的幻数。然后简单的子字符串将起作用,因为你知道你的' *'它们是从哪里开始的。

这也有效:

    String s1 = "someThing/one_text_0000_temperature****";
    String step = "94";
    String v = "0000000000" + step;
    String result = s1.substring(0, s1.indexOf('*')) + v.substring(v.length() - s1.length() - s1.indexOf('*'));
    System.out.println(result);

答案 1 :(得分:0)

我试试这个:

String test = "test****";  //test: "test****"
int one = test.indexOf("*"); //one: 4
int two = test.lastIndexOf("*"); //two: 7
int nb = two-one; //nb: 3 two: 7 one: 4

String newTest= test.replace("*","0"); //newTest: "test0000"
String step = "12"; //step: "12"
newTest = newTest.substring(0,newTest.length()-step.length()); //newTest: "test00"
newTest += step; //newTest: "test001"

您还可以在' nb'之间添加尺寸检查。和' step.length()' 。如果step.length()高于你的号码或者' *'你做什么的?

答案 2 :(得分:0)

我为你的问题编写了这段代码:

    int step = 94;
    String[] input = new String[]{
        "someThing/one_text_0000_temperature****",
        "another/two_text_0000_temperature****",
        "where/three_text_0000_temperature****"
    };

    for (String i : input) {
        int start = i.indexOf('*');
        int size = i.length() - start;
        int stepsize = (step + "").length();
        if(stepsize > size)  {
            throw new IllegalArgumentException("Too big step :D");
        }
        String result = i.replace('*', '0').substring(0, i.length() - stepsize) + step;

        System.out.println(result);
    }

我希望它对你有所帮助:)。