[英]remove comma and some characters from a string
我有一个可以采用任何格式的字符串,如下所示:
'xyz','abc' //after conversion --> 'abc'
'abc','xyz' //after conversion --> 'abc'
'xyz' //after conversion -->
'abc','xyz','abc' //after conversion --> 'abc','abc'
在这我必须删除'xyz'
,如果它有任何前导或尾随逗号。 请建议我如何使用正则表达式来实现这一点。
谢谢
您可以链接一些String::replace
方法
String str = "'abc','xyz','abc'";
str = str.replace (",'xyz'", "").replace("'xyz',", "").replace("'xyz'", "");
output
'abc','abc'
单独的正则表达式并不能很好地完成这项任务。 但是,您可以执行以下操作:
"'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
或equalsIgnoreCase
,甚至正则表达式。
可能值得将过滤规则提取到单独的谓词中,以便您可以在需要时更轻松地更改它
Predicate<String> filterRule = chunk -> !"'xyz'".equals(chunk);
/* ... */
.filter(filterRule)
/* ... */
虽然如果我们检查这个"'xyz'".equals
本身已经是一个谓词,并且谓词可以被否定,所以你不需要为此编写一个完整的 lambda ,而只需将这些方法重新用作函数接口:
Predicate<String> stuffWeDontWant = "'xyz'"::equals;
Predicate<String> filterRule = stuffWeDontWant.negate();
这都可以内联,但它有点难看,因为你必须将它转换为正确的谓词来否定它
Predicate<String> filterRule = ((Predicate<String>) "'xyz'"::equals).negate();
最后的事情可能如下所示:
Predicate<String> filterRule = ((Predicate<String>) "'xyz'"::equals).negate();
String result = Arrays.stream(str.split(("\\s*,\\s*")))
.filter(filterRule)
.collect(Collectors.joining(","));
因此,现在您可以更轻松地更改您的过滤规则。 您甚至可以通过传递不同的谓词作为过滤器将其重新用于任何类型的列表。
执行以下操作的非 Java 8 或非 Stream 方式:
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()
与使用 Predicate 混合,但这次它必须完全匹配你不想要的:
list.removeIf("'xyz'"::equals);
/* or */
list.removeIf("'xyz'"::equalsIgnoreCase);
/* or */
list.removeIf("'xyz'"::startsWith);
/* or */
list.removeIf("'xyz'"::contains);
/* or */
list.removeIf("'xyz'"::endsWith);
/* or */
list.removeIf(Pattern.compile("'(xy?z)*'").asPredicate());
/* ...and so on... */
https://programming.guide/java/remove-trailing-comma-from-comma-separated-string.html
有很多文章可以帮助您编写适当的正则表达式。 以上应该有帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.