使用正则表达式替换集合中的元素

Replacing element inside a Collection by using regular expressions

我有 Collection 个字符串。

我需要用给定的相关字符替换一些字符。

我试过这个。但是我的代码却不能正常工作。

public class MyPattern {
    public static void main(String[] args)
    {
        String items;
        Collection<String> arr = new ArrayList<String>();
        arr.add("I00.30");  //Expected output: 100.30
        arr.add("8B4.99");  //Expected output: 884.99
        arr.add("B37.2B");  //Expected output: 837.28
        arr.add("292.b4");  //Expected output: 262.64
        arr.add("24|.7O");  //Expected output: 241.70
        arr.add("B55.I4");  //Expected output: 855.14
        arr.add("444.07");  //Expected output: 444.07

        for(String item:arr)
        {
            System.out.println(item);
            items = item.toUpperCase().replaceAll("l", "1")
                .replaceAll("l", "1")
                .replaceAll("i", "1")
                .replaceAll("|", "1")
                .replaceAll("G", "6")
                .replaceAll("b", "6")
                .replaceAll("B", "8")
                .replaceAll("O", "0");
            System.out.println(items);
        }
    }
}

replaceAll() 方法中传递的字母必须在 集合 中的每个项目中替换。

有没有办法找到不相关的字符并用数字替换它(如上面的代码所示)?

您的代码正在重新分配变量 item,它不会影响列表内容。

要做到这一点,您可以将变量 arr 的类型更改为 List。这样,您就可以使用传统的 (index based) for 循环对其进行迭代。

List<String> arr = // initializing the list

for (int i = 0; i < arr.size(); i++) {
    String item = replace(arr.get(i)); // method replace provided below
    arr.set(i, item);
}

另一种选择是使用 Java 8 replaceAll() 方法,它需要一个 function 将应用于集合中的每个元素。

arr.replaceAll(str -> replace(str));
public static String replace(String source) {
    return source.toUpperCase()
            .replaceAll("[LI|]", "1")
            .replaceAll("[GB]", "6")
            .replace("O", "0");
}

注意 期望 正则表达式 的方法 replaceAll() 更多比 replace() 贵。因此,当您不需要 regex 时,最好使用任何类型的 replace()(带有 charString 参数)。

在这里,您可以通过使用正则表达式 "[LI|]".[= 一次性处理字符 LL| 来受益于 replaceAll() 32=]

For more information on regular expressions take a look at this tutorial

您的代码中还有一个小问题

  • 应用 toUpperCase() 后,尝试替换 'l' 或 'i'.
  • 等小写字母没有意义
  • "b", "6""B", "8" 有冲突。

我希望通过所有这些提示,您将能够设法使其正常工作。

而不是使用 for 循环。你可以使用,stream。 例如,如果要将每个元素中的 i 更改为 1,则可以使用以下代码获取它。而你想要

Collection<String> arr_new = arr.stream().map(String::toLowerCase).map(t->t.replaceAll("i",1)).map(String::toUpperCase);

在这里,第一个映射将字符串转换为 lower-case,第二个映射将替换您需要的内容,第三个映射将其转换为大写。 希望这就是您要找的。