您可以链接一些String::replace
方法
String str = "'abc','xyz','abc'";
str = str.replace (",'xyz'","").replace("'xyz',","").replace("'xyz'","");
输出
'abc','abc'
,
仅Regex不能很好地完成此任务。但是,您可以执行以下操作:
- 用逗号分隔字符串。实际上,例如,如果收到的字符串是
"'abc','xyz'"
,则可以用逗号分隔,并用任意数量的空格包围。您可以为此使用正则表达式\s*,\s*
。
- 删除所有与您不需要的字符串匹配的内容-您可以使用基本的字符串匹配或正则表达式来处理更复杂的模式。
- 再次将分割后的字符串转换为逗号分隔的列表。
Usign Java 8 Stream操作,可以很简短:
String[] split = str.split(("\\s*,\\s*")); //1. split into separate strings
String result = Arrays.stream(split) //turn to stream
.filter(chunk -> !"'xyz'".equals(chunk)) //2. remove anything you don't want
.collect(Collectors.joining(",")); //3. convert back to comma separated list
.filter
谓词可以更改为适合您的谓词-如果您只想匹配"'abc'"
,则可以使用chunk -> "abc'".equals(chunk)
或使用.contains
或{{ 1}},甚至是正则表达式。
可能有必要将过滤器规则提取到单独的谓词中,因此您可以在需要时更轻松地进行更改
equalsIgnoreCase
尽管如果我们检查此Predicate<String> filterRule = chunk -> !"'xyz'".equals(chunk);
/* ... */
.filter(filterRule)
/* ... */
本身已经是一个谓词,并且谓词可以被否定,那么您不需要为此编写整个lambda,而只需将这些方法用作功能接口即可:
"'xyz'".equals
所有这些都可以内联,但是有点丑陋,因为您必须将其转换为适当的谓词以使其否定
Predicate<String> stuffWeDontWant = "'xyz'"::equals;
Predicate<String> filterRule = stuffWeDontWant.negate();
最后一件事看起来像这样:
Predicate<String> filterRule = ((Predicate<String>) "'xyz'"::equals).negate();
因此,现在您可以更轻松地更改任何过滤规则。您甚至可以通过传递不同的谓词作为过滤器,甚至将其用于任何类型的列表。
使用非Java 8或非Stream的方法执行以下操作:
Predicate<String> filterRule = ((Predicate<String>) "'xyz'"::equals).negate();
String result = Arrays.stream(str.split(("\\s*,\\s*")))
.filter(filterRule)
.collect(Collectors.joining(","));
此方法仍然可以与通过使用String[] split = str.split(("\\s*,\\s*")); //1. split into separate strings
List<String> list = new ArrayList<>(Arrays.asList(split));//convert into an ArrayList to allow removing
list.removeAll(Collections.singleton("'xyz'"));//2. remove anything you don't want
String result = String.join(",list); //3. convert back to comma separated list
的谓词一起使用,但是这次必须与您不想要的完全匹配:
.removeIf()
本文链接:https://www.f2er.com/3154565.html