如何使用正则表达式拆分字符串而不消耗拆分器部分?

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)|(?&lt;=#.6) 作为拆分器。【参考方案2】:

@vrintle +1 给出的答案可能是可以为您的确切输入编写的最严格的代码。但是,假设除了: 之外,您的输入中可能还有其他非单词字符,那么您还可以使用环视更精确地进行拆分:

String from = "one:two:three";
String[] parts = from.split("(?<=:)|(?=:)");
System.out.println(Arrays.toString(parts));

打印出来:

[one, :, two, :, three]

【讨论】:

天哪,这太美了! @Eugene 别说了!你让我脸红了:-) 我编辑了这篇文章,因为它并不完全符合我的需要。 @vrintle 准确地评论了我需要什么。不过还是谢谢。 :)

以上是关于如何使用正则表达式拆分字符串而不消耗拆分器部分?的主要内容,如果未能解决你的问题,请参考以下文章

当正则表达式的某些部分要保存在后续的分割字符串中时,如何使用正则表达式在R中拆分字符串?

Java如何拆分正则表达式和字符串?

C# 正则表达式拆分为 Java 模式拆分

如何使用正则表达式拆分字符串并包含空格

带有嵌套数组的正则表达式拆分数组(字符串)

如何使用正则表达式拆分字符串以返回值列表?