Java Regex在分隔符和保留分隔符之间拆分字符串[重复]

Posted

技术标签:

【中文标题】Java Regex在分隔符和保留分隔符之间拆分字符串[重复]【英文标题】:Java Regex split string between delimiter and keep delimiter [duplicate] 【发布时间】:2017-07-24 14:29:13 【问题描述】:

我有一个类似这样的 java 字符串;

(fname:jon)(lname:doe)(guaranteer: Sam (W) Willis)(age:35)(addr:1 Turnpike Plaza)(favcolor:blue)

我想从分隔符(fname:jon)<here>(lname:doe) 中拆分此字符串。

我尝试通过正则表达式 \)\( 进行拆分,但它只是破坏了我的代码

arr = s.split("\\)\\(");
for (String a: arr) System.out.println(a);

输出

(fname:jon
lname:doe
guaranteer: Sam (W) Willis
age:35
addr:1 Turnpike Plaza
favcolor:blue)

我也看过这个问题:How to split a string, but also keep the delimiters?,但这并没有帮助,因为在我的情况下,我想保留分隔符 )( 并均匀拆分分隔符,即第一个括号应该放在第一位结果和第二到第二个结果。

我使用的正则表达式是s.split("(?<=\\)\\()"),它给出了输出:

(fname:jon)(
lname:doe)(
guaranteer: Sam (W) Willis)(
age:35)(
addr:1 Turnpike Plaza)(
favcolor:blue)

这是我想要的输出:

(fname:jon)
(lname:doe)
(guaranteer: Sam (W) Willis)
(age:35)
(addr:1 Turnpike Plaza)
(favcolor:blue)

【问题讨论】:

试试(?<=\\))(?=\\() @Wiktor Stribiżew 我已经特别指出了为什么这个答案对我的情况没有帮助。你能告诉我为什么会重复吗? 概括所有这些情况的答案是***.com/a/2848147/3832970。倒数第三个是你的情况。 【参考方案1】:

您可以像这样使用正向前瞻和正向后视来拆分字符串:

正则表达式(?<=\))(?=\()

DEMO

    (?<=\)) 正向lookbehind,表示右括号应该在拆分位置之前。 (?=\() 正向前瞻,表示左括号应该跟在拆分位置之后。

输出

(fname:jon)
(lname:doe)
(guaranteer: Sam (W) Willis)
(age:35)
(addr:1 Turnpike Plaza)
(favcolor:blue)

代码

String s = "(fname:jon)(lname:doe)(guaranteer: Sam (W) Willis)(age:35)(addr:1 Turnpike Plaza)(favcolor:blue)";
String arr[] = s.split("(?<=\\))(?=\\()");
for (String a: arr) System.out.println(a);

【讨论】:

删除无意义的.0 - 它没有任何效果,你错了:这里没有匹配“null”字符,null char是'\0'。匹配是基于环视的个字符之间,这没什么特别的。 @Bohemian 我最初保留.0 只是为了表明这是分隔符。 null 我实际上是指正向前瞻和正向后视之间的空白位置。但是,感谢您指出这一点,我已经相应地更新了我的答案。 你并没有真正更新你所有的帖子,尤其是第一句话 @Bohemian 已更新。【参考方案2】:

您可以使用 positive lookbehindnegative lookahead 来实现此目的:

public static void main(String[] args) throws Exception 
    String s = "(fname:jon)(lname:doe)(guaranteer: Sam (W) Willis)(age:35)"
            + "(addr:1 Turnpike Plaza)(favcolor:blue)";
    String[] arr = s.split("(?<=\\)(?!\\s))"); // positive lookbehind for ")" and negative lookahead for "space"
    for (String str : arr) 
        System.out.println(str);
    


O/P:

(fname:jon)
(lname:doe)
(guaranteer: Sam (W) Willis)
(age:35)
(addr:1 Turnpike Plaza)
(favcolor:blue)

【讨论】:

以上是关于Java Regex在分隔符和保留分隔符之间拆分字符串[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何保留 Regex.Split 的分隔符?

使用贪婪令牌保留 REGEX 分隔符

Java Regex - 拆分逗号分隔列表,但在括号内排除逗号

Java Regex - 拆分逗号分隔列表但排除方括号内的逗号

Java - 正则表达式拆分输入文本但保留分隔符[重复]

java - 如何拆分字符串,同时保留分隔符?