如何使用正则表达式拆分字符串而不消耗拆分器部分?
Posted
技术标签:
【中文标题】如何使用正则表达式拆分字符串而不消耗拆分器部分?【英文标题】:How to split string using regex without consuming the splitter part? 【发布时间】:2021-03-06 20:18:13 【问题描述】:如何在不消耗拆分器部分的情况下拆分字符串?
像这样的东西,但:
我使用的是#[a-fA-F0-9]6
正则表达式。
String from = "one:two:three";
String[] to = ["one",":","two",":","three"];
我已经尝试过使用 commons lib,因为它有 StringUtils.splitPreserveAllTokens()
,但它不适用于正则表达式。
编辑:我想我应该更具体一些,但这更多的是我想要的。
String string = "Some text here #58a337test #a5fadbtest #123456test as well.
#58a337Word#a5fadbwith#123456more hex codes.";
String[] parts = string.split("#[a-fA-F0-9]6");
/*Output: ["Some text here ","#58a337","test ","#a5fadb","test ","#123456","test as well. ",
"#58a337","Word","#a5fadb","with","#123456","more hex codes."]*/
编辑 2:解决方案!
final String string = "Some text here #58a337test #a5fadbtest #123456test as
well. #58a337Word#a5fadbwith#123456more hex codes.";
String[] parts = string.split("(?=#.6)|(?<=#.6)");
for(String s: parts)
System.out.println(s);
输出:
Some text here
#58a337
test
#a5fadb
test
#123456
test as well.
#58a337
Word
#a5fadb
with
#123456
more hex codes.
【问题讨论】:
【参考方案1】:您可以使用 \\b
(word-break, \
escaped) 来拆分您的情况,
final String string = "one:two:three";
String[] parts = string.split("\\b");
for(String s: parts)
System.out.println(s);
Try it online!
【讨论】:
这确实适用于:
,但我需要它来处理这个正则表达式#[a-fA-F0-9]6
。我现在编辑了帖子以使其更准确。
@Lynx - 然后与 Tim 一起使用 (?=#.6)|(?<=#.6)
作为拆分器。【参考方案2】:
@vrintle +1 给出的答案可能是可以为您的确切输入编写的最严格的代码。但是,假设除了:
之外,您的输入中可能还有其他非单词字符,那么您还可以使用环视更精确地进行拆分:
String from = "one:two:three";
String[] parts = from.split("(?<=:)|(?=:)");
System.out.println(Arrays.toString(parts));
打印出来:
[one, :, two, :, three]
【讨论】:
天哪,这太美了! @Eugene 别说了!你让我脸红了:-)
我编辑了这篇文章,因为它并不完全符合我的需要。 @vrintle 准确地评论了我需要什么。不过还是谢谢。 :)以上是关于如何使用正则表达式拆分字符串而不消耗拆分器部分?的主要内容,如果未能解决你的问题,请参考以下文章