[英]How to split a string, keeping only certain delimiters?
我有一个类似于如何拆分字符串的问题,但也保留了分隔符? 。 我如何使用正则表达式拆分字符串,保留某些类型的分隔符,而不是其他类型的分隔符? 具体来说,我想保留非空白分隔符,但不保留空白分隔符。
为了使这个具体:
"a;b c" | ["a", ";", "b", "c"]
"a; ; bb c ;d" | ["a", ";", ";", "bb", "c", ";", "d"]
这可以用正则表达式干净地完成,如果是这样的话怎么样?
现在我正在解决这个问题,分别保留角色,然后再另一个。 如果正则表达式不能这样做,或者不能干净利落,我可以坚持这种方法:
Arrays.stream(input.split("((?<=;)|(?=;))"))
.flatMap(s -> Arrays.stream(s.split("\\s+")))
.filter(s -> !s.isEmpty())
.toArray(String[]::new); // In practice, I would generally use .collect(Collectors.toList()) instead
你可以这样做:
System.out.println(String.join("-", "a; ; b c ;d".split("(?!\\G) *(?=;)|(?<=;) *| +")));
细节:
(?!\\G) # not contiguous to a previous match and not at the start of the string
[ ]* # optional spaces
(?=;) # followed by a ;
| # OR
(?<=;) # preceded by a ;
[ ]* # optional spaces
| # OR
[ ]+ # several spaces
随意将文字空间更改为\\\\s
。 要避免空项(当字符串以空格开头时,在结果数组的开头) ,您需要首先修剪字符串。
显然,没有分裂的约束,@ alphabravo方式是最简单的。
我找到了一个有效的正则表达式:
(\\s+)|((?<=;)(?=\\S)|(?<=\\S)(?=;))
public static void main(String argss[]){
System.out.println(Arrays.toString("a; ; b c ;d"
.split("(\\s+)|((?<=;)(?=\\S)|(?<=\\S)(?=;))")));
}
将打印出来:
[a, ;, ;, b, c, ;, d]
您想要在空格上或在字母和非字母之间拆分:
str.split("\\s+|(?<=\\w)(?=\\W)|(?<=\\W)(?=\\w)");
在实现Java不支持将捕获的拆分字符添加到
拆分数组元素,以为我会尝试没有它的拆分解决方案
能力。
基本上只有4个排列涉及空格和结肠。
最后,只有空白。
这是正则表达式。
Raw: \\s+(?=;)|(?<=;)\\s+|(?<!\\s)(?=;)|(?<=;)(?!\\s)|\\s+
弦乐: "\\\\s+(?=;)|(?<=;)\\\\s+|(?<!\\\\s)(?=;)|(?<=;)(?!\\\\s)|\\\\s+"
扩展的正则表达式与排列的解释。
祝好运!
\s+ # Required, suck up wsp before ;
(?= ; ) # ;
| # or,
(?<= ; ) # ;
\s+ # Required, suck up wsp after ;
| # or,
(?<! \s ) # No wsp before ;
(?= ; ) # ;
| # or,
(?<= ; ) # ;
(?! \s ) # No wsp after ;
| # or,
\s+ # Required wsp
编辑
要停止在BOS上的空白分割,请使用此正则表达式。
Raw: \\s+(?=;)|(?<=;)\\s+|(?<!\\s)(?=;)|(?<=;)(?!\\s)|(?<!^)(?<!\\s)\\s+
弦乐: "\\\\s+(?=;)|(?<=;)\\\\s+|(?<!\\\\s)(?=;)|(?<=;)(?!\\\\s)|(?<!^)(?<!\\\\s)\\\\s+"
解释:
\s+ # Required, suck up wsp before ;
(?= ; ) # ;
| # or,
(?<= ; ) # ;
\s+ # Required, suck up wsp after ;
| # or,
(?<! \s ) # No wsp before ;
(?= ; ) # ;
| # or,
(?<= ; ) # ;
(?! \s ) # No wsp after ;
| # or,
(?<! ^ ) # No split of wsp at BOS
(?<! \s )
\s+ # Required wsp
借用@CasimiretHippolyte \\G
技巧你可能想分开
\\s+|(?!\\G)()
注意:未指定分隔符。
基于避免在第一个空间上拆分:
(?m)(?<!^|\\s)(\\s+|)(?!$)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.