繁体   English   中英

从字符串中删除逗号和一些字符

[英]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'

单独的正则表达式并不能很好地完成这项任务。 但是,您可以执行以下操作:

  1. 用逗号分割你的字符串。 事实上,你可以用逗号分隔任意数量的空格,例如,如果你得到的刺痛是"'abc', 'xyz'" 您可以为此使用正则表达式\s*,\s*
  2. 删除与您不想要的字符串匹配的任何内容 - 您可以使用基本字符串匹配或正则表达式来获取更复杂的模式。
  3. 再次将拆分的字符串转换为逗号分隔的列表。

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)或者您可以使用.containsequalsIgnoreCase ,甚至正则表达式。


可能值得将过滤规则提取到单独的谓词中,以便您可以在需要时更轻松地更改它

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM