如何替换字符串中一定数量的空格后出现的子字符串?

时间:2013-12-01 02:57:16

标签: java regex string

我正在以这种格式从文件中提取数据:

`1111 1.0 2222 53.5 3333 0.3 4444 541.1 5555 0.3'

现在假设我想用0.3替换32.2。我如何用Java最好地解决它?

我想过使用str.replaceAll(str.substring(beginIndex, endIndex), replacement)。但是,它需要一个开始和结束索引,我无法轻易提供。

Java中最好的方法是什么?

编辑:可能有多个0.3的实例。我只希望改变某个号码之后发生的号码。空间。例如,这个在5个空格之后发生。

5 个答案:

答案 0 :(得分:1)

以下简洁,动态适应性强。我实例化变量以提供示例,但关键部分是代码的第一行和最后一行:

String regex = "(?<=\\s{%s})%s(?=\\s{%s})";
String numSpaces = "1";
String number = "0.3";
String replacement = "32.2";
String yourString = "1111 1.0 2222 53.5 3333 0.3 4444 541.1";
yourString = yourString.replaceAll(String.format(regex, numSpaces, number, numSpaces),
                                   replacement);
System.out.println(yourString);
//prints 1111 1.0 2222 53.5 3333 32.2 4444 541.1

在此示例中,"(?<=\\s{%s})%s(?=\\s{%s})"将变为:(?<=\\s{1})0.3(?=\\s{1}),这意味着"0.3"前后有一个空格标记,它利用了正面看后方和前方,以便只更换数字,空格保持不变。

另请注意,replaceAll()只应在处理正则表达式时使用。如果您不使用正则表达式,请改用.replace().replace()也取代了所有实例,这个名称有点误导。

注意,如果前后空格的数量应该不同,只需将最后一个参数更改为String.format(),以使该数字后的空格数为。

编辑
显然我们以不同方式定义空格。我假设一定数量的空格字面意思是在有问题的数字之前和之后有一定数量的空格。

答案 1 :(得分:0)

尝试,

  String str="1111 1.0 2222 53.5 3333 0.3 4444 541.1 ";

  str=str.replaceAll(" 0.3 ", " 32.2 ");    
  System.out.println(str);

答案 2 :(得分:0)

假设您要替换字符串中的所有0.3已测试并正常工作):

String s = "1111 1.0 2222 53.5 3333 0.3 4444 541.1";

// replace "0.3 " at the beginning of the String
if (s.substring(0,4).equals("0.3 "))
    s = "32.2" + s.substring(3);

// replace " 0.3" at the end of the String
if (s.substring(s.length() - 4).equals(" 0.3"))
    s = s.substring(0, s.length() - 4) + " 32.2";

// replace all the rest of the "0.3" in the String
s = s.replaceAll(" 0.3 ", " 32.2 ");

输入/输出:

输入:

  

“1111 1.0 2222 53.5 3333 0.3 4444 541.1”

输出:

  

“1111 1.0 2222 53.5 3333 32.2 4444 541.1”

输入:

  

“0.3 1111 1.0 2222 53.5 3333 0.3 4444 541.1 0.3”

输出:

  

“32.2 1111 1.0 2222 53.5 3333 32.2 4444 541.1 32.2”

输入:

  

“0.35 1111 1.0 2222 53.5 3333 0.3 4444 540.3”

输出:

  

“0.35 1111 1.0 2222 53.5 3333 32.2 4444 540.3”

答案 3 :(得分:0)

尝试使用此正则表达式\b0\.3\b \b是一个单词边界,允许您将0.3视为单词 0是0
\.表示点文字。你必须逃避点,因为正则表达式中的点将匹配任何字符 3是文字3.

记住在java中你必须转义反斜杠,所以你的最终正则表达式就是这个。

String regexp = "\\b0\\.3\\b";

示例Junit测试

package demo;
import static org.junit.Assert.*;
import org.junit.Test;

public class Matchy {
    String regexp = "\\b0\\.3\\b";
    @Test
    public void test() {
        String str = "0.3 0.2 123.4 0.3 0.3 013";   
        String result = str.replaceAll(this.regexp, "32.2");
        String expect = "32.2 0.2 123.4 32.2 32.2 013";
        assertEquals(str, expect, result);
    }
    @Test
    public void test2() {
        String str = "1111 1.0 2222 53.5 3333 0.3 4444 541.1";  
        String result = str.replaceAll(this.regexp, "32.2");
        String expect = "1111 1.0 2222 53.5 3333 32.2 4444 541.1";
        assertEquals(str, expect, result);
    }

}

答案 4 :(得分:0)

我认为这段代码可以做你想要的。

String str = "1111 1.0 2222 53.5 3333 0.3 4444 541.1 5555 0.3";
int numSpaces = 5;
String replacement = "32.2";
Matcher m = Pattern.compile("((?:\\S+\\s+){" + numSpaces + "})(\\S+)(.*)").matcher(str);
m.find();
System.out.println("replaced " + m.group(2) + " with " + replacement + " at index " + m.start(2));
System.out.println(m.group(1) + replacement + m.group(3));