我有一个可以采用以下任何格式的字符串:
'xyz','abc' //after conversion --> 'abc'
'abc','xyz' //after conversion --> 'abc'
'xyz' //after conversion -->
'abc','xyz','abc' //after conversion --> 'abc','abc'
在此,我必须删除'xyz'
,如果它有任何前导或尾随逗号。
请提出如何使用正则表达式实现这一目标。
谢谢
答案 0 :(得分:1)
您可以链接一些String::replace
方法
String str = "'abc','xyz','abc'";
str = str.replace (",'xyz'", "").replace("'xyz',", "").replace("'xyz'", "");
输出
'abc','abc'
答案 1 :(得分:0)
仅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,而只需将这些方法用作功能接口即可:< / p>
"'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()