使用正则表达式替换集合中的元素
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()
(带有 char
或 String
参数)。
在这里,您可以通过使用正则表达式 "[LI|]"
.[= 一次性处理字符 L
、L
和 |
来受益于 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,第二个映射将替换您需要的内容,第三个映射将其转换为大写。
希望这就是您要找的。
我有 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()
(带有 char
或 String
参数)。
在这里,您可以通过使用正则表达式 "[LI|]"
.[= 一次性处理字符 L
、L
和 |
来受益于 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,第二个映射将替换您需要的内容,第三个映射将其转换为大写。 希望这就是您要找的。