替换java中String中的数字

时间:2013-11-22 17:08:57

标签: java string replace

我正在尝试找出一种安全地用其他字符串替换字符串中的整数的方法。 基本上输入将是一个字符串,例如“1 OR 2 AND 3”。然后我还会得到一个字符串列表。在这种情况下,它将是3个字符串的列表。例如,“Name = 1”,“Name = 2”和“Name = 3”。

然后我需要用字符串替换整数。

以下是一个例子:

import java.text.MessageFormat;

public class TestStringBuilder
{
    public static void main(String[] args)
    {
        TestStringBuilder builder = new TestStringBuilder();
        String output;
        String[] filters = { "Name = 1", "Name = 2", "Name = 3" };
        output = builder.buildString(filters);
        System.out.println(output);
        output = builder.formatString(filters);
        System.out.println(output);
        System.out.println();

        /* Now swap around first two strings */
        String[] filters2 = { "Name = 2", "Name = 1", "Name = 3" };
        output = builder.buildString(filters2);
        System.out.println(output);
        output = builder.formatString(filters2);
        System.out.println(output);
        }

    private String formatString(Object[] filters)
    {
        /* Wrap integers in {} here first */
        String advanced = "{1} OR {2} OR {1}";
        return MessageFormat.format(advanced, filters);
    }

    private String buildString(String[] filters)
    {
        String advanced = "1 OR 2 OR 1";
        /*
         * Now replace the numbers with the actual filters in human readable
         * form. Note: We loop from 10 to 1 so that 10 is replaced first. If we
         * loop from 1 to 10, 1 will replace 1 and 10 incorrectly.
         */
        for (int i = filters.length; i > 0; i--)
        {
            /* Index for 0 based array */
            String filter = filters[i - 1];
            if ((filter != null) && (filter.length() > 0))
            {
                advanced = advanced.replaceAll(Integer.toString(i), filter);
            }
        }
        return advanced;
    }
}

首先,我做了一个简单的String.replaceAll。问题是,如果我输入的字符串包含一个整数,则可以替换它。

E.g。

我使用String数组String[] filters = { "Name = 1", "Name = 2", "Name = 3" };

这很好用,输出是:

Name = 1 OR Name = 2 OR Name = 1

但是,如果我使用String[] filters = { "Name = 2", "Name = 1", "Name = 3" };

输出不正确,因为“Name = 1”中的1也被替换:

名称= 2或名称=名称= 2或名称= 2

然后我尝试使用java.Text.FormatMessage。但是,在这种情况下,我需要循环遍历字符串以首先包装{}中的所有整数,然后创建一个第一个值为空的新Object []。这是运行上述示例的输出:

名称= 2或名称= 3或名称= 2

名称= 1或名称= 3或名称= 1

有没有人有其他想法?

2 个答案:

答案 0 :(得分:2)

您可以使用正则表达式(Pattern):

public static String format(String input, String[] args) {
    StringBuffer sb = new StringBuffer();

    Matcher matcher = Pattern.compile("\\d+").matcher(input);
    while (matcher.find()) {
        int nr = Integer.parseInt(matcher.group());
        if (nr <= args.length) {
            matcher.appendReplacement(sb, Matcher.quoteReplacement(args[nr - 1]));
        }
    }

    matcher.appendTail(sb);

    return sb.toString();
}

有关Java中正则表达式的好教程可以在这里找到:http://tutorials.jenkov.com/java-regex/matcher.html

答案 1 :(得分:0)

我不知道,可能是

之类的东西
String s = "1 OR 2 AND 3";
s=s.replace("1","Name=1");
s=s.replace("2","Name=2");
s=s.replace("3","Name=3");

我不确定这是否是你想要的。