如何在java中查找和替换字符串中出现的所有子字符串?

bprjcwpo  于 2021-07-04  发布在  Java
关注(0)|答案(4)|浏览(336)

我查看了现有的主题,但我的任务与论坛上的略有不同。我有价值:

int j = 37;

我有一根弦:

1) String s1 = "5+2+5+2 --j *2*7+3";
2) String s1 = "5+2+5+2 j-- *2*7+3";
3) String s1 = "5+2+5+2 ++j *2*7+3";
4) String s1 = "5+2+5+2 j++ *2*7+3";

我需要正则表达式 --j , j-- , ++j , j++ 并将字符串中出现的子字符串替换为数值 j ;
结果字符串必须如下所示:

1) 5+2+5+2 36 *2*7+3
2) 5+2+5+2 36 *2*7+3
3) 5+2+5+2 38 *2*7+3
4) 5+2+5+2 38 *2*7+3

带图案 str.split(search).join(replacement) 我可以替换字符 j 带编号 37 :

str.split("j").join(37);

然后我得到:

1) String s1 = "5+2+5+2 --37 *2*7+3";
2) String s1 = "5+2+5+2 37-- *2*7+3";
3) String s1 = "5+2+5+2 ++37 *2*7+3";
4) String s1 = "5+2+5+2 37++ *2*7+3";

问题:
但是如何进行算术运算呢( increment , decrement )在这个时候?

rbl8hiat

rbl8hiat1#

注意,在这个问题中,操作并不遵循java行为,即pre-increment和postincrement的行为都类似于preincrement。
要实现此行为,我们需要两个正则表达式:
一个表达式匹配所有表达式 --j 以及 j-- 将它们替换为 j - 1 : [-]{2}j|j[-]{2} regex101演示
一个表达式匹配所有表达式 ++j 以及 j++ 将它们替换为 j + 1 : [+]{2}j|j[+]{2} regex101演示
综合起来,我们可以写出以下方法:

public static String replaceJWith(String s, int valueForJ) {
    s = s.replaceAll("[-]{2}j|j[-]{2}", Integer.toString(valueForJ - 1));
    return s.replaceAll("[+]{2}j|j[+]{2}", Integer.toString(valueForJ + 1));
}

ideone演示
此实现假定 j 前缀或后缀为 ++ 或者 -- . 而且,因为我们从未真正改变 j ,在单个 String 会导致意想不到的行为。
如果我们想模仿java行为(即区分pre-increment和post-increment),我们需要三个不同的正则表达式,因为我们必须替换 j 有三个不同的值:
要替换的正则表达式 j(++|--) 原值为 j : j(?:[+]{2}|[-]{2}) regex101演示
要替换的正则表达式 ++j 有价值的 j + 1 : [+]{2}j regex101演示
要替换的正则表达式 --j 有价值的 j - 1 : [-]{2}j regex101演示
综合起来,我们可以编写以下java方法:

public static String replaceJWith(String s, int valueForJ) {
    s = s.replaceAll("j(?:[+]{2}|[-]{2})", Integer.toString(valueForJ));
    s = s.replaceAll("[+]{2}j", Integer.toString(valueForJ + 1));
    return s.replaceAll("[-]{2}j", Integer.toString(valueForJ - 1));
}

ideone演示
此解决方案与第一个解决方案具有相同的限制。

hxzsmxv2

hxzsmxv22#

public class Test
{
    public static void main(String[] args)
    {
        int j = 37;
        String s1 = "5+2+5+2 ++j *2*7+3";

        // this line swap "j--" or "--j" on j--
        s1 = s1.replaceAll("j--|--j", j-1 + "");

        // this line swaps "j++" or "++j" on j++
        s1 = s1.replaceAll("(j\\+\\+)|(\\+\\+j)", j+1 + "");

        System.out.println(s1);
    }
}
oxcyiej7

oxcyiej73#

String.replaceAll 可按如下方式使用:

int j = 37;
String[] d = {
    "5+2+5+2 --j *2*7+3",
    "5+2+5+2 j-- *2*7+3",
    "5+2+5+2 ++j *2*7+3",
    "5+2+5+2 j++ *2*7+3"
};

Arrays.stream(d)
      .map(s -> s.replaceAll("--j|j--", Integer.valueOf(j - 1).toString()))
      .map(s -> s.replaceAll("\\+\\+j|j\\+\\+", Integer.valueOf(j + 1).toString()))
      .forEach(System.out::println);

提供预期输出:

5+2+5+2 36 *2*7+3
5+2+5+2 36 *2*7+3
5+2+5+2 38 *2*7+3
5+2+5+2 38 *2*7+3
mzsu5hc0

mzsu5hc04#

你可以使用一系列 if 语句,使用 contains() 然后用相应的值替换图案:

if (s1.contains("--j") {
  s1.replace("--j", String.valueOf(j-1)); //assuming you have declared int j = 37; before 
} else if (s1.contains("j--")) { 
  //etc.
} [...]

相关问题