Java 正则表达式在不在括号内的点上拆分字符串
正如标题所说,我想写一个正则表达式r,这样Java 正则表达式在不在括号内的点上拆分字符串,java,regex,Java,Regex,正如标题所说,我想写一个正则表达式r,这样 Splitter.onPattern(r.splitToList)(“a.b.c.d[e.f.g]”)导致 [a, b, c, d[e.f.g]] 我一直在胡闹,想把它弄对,但弄不清楚。我认为“\\。((?!\\[)*)\\]*”应该是有效的(匹配任何后跟不包含“[”且以“]”结尾的字符串的点),但出于某种原因,它仍然会在所有点上分裂。对于所显示的示例,请尝试以下内容,同时假设[和]是平衡的,而不是嵌套的 \.(?![^[]*]) 这是你的电话号码
Splitter.onPattern(r.splitToList)(“a.b.c.d[e.f.g]”)代码>导致
[a, b, c, d[e.f.g]]
我一直在胡闹,想把它弄对,但弄不清楚。我认为“\\。((?!\\[)*)\\]*”
应该是有效的(匹配任何后跟不包含“[”且以“]”结尾的字符串的点),但出于某种原因,它仍然会在所有点上分裂。对于所显示的示例,请尝试以下内容,同时假设[
和]
是平衡的,而不是嵌套的
\.(?![^[]*])
这是你的电话号码
解释:匹配一个不后跟0个或多个字符且不带[和]的点。诀窍是断言下一个括号字符(如果有)不是右括号
在正则表达式中,这表示为“后面没有任何数量的非括号,然后是a]
”:
看
注意:这不适用于嵌套的虚线表达式,如a.b[c.d[e.f].g].h
使用
[^\[\].]+(?:\[^\[\]]*])?
看
解释
--------------------------------------------------------------------------------
[^\[\].]+除以下字符以外的任何字符:“\[”、“\]”、“.”(1)
或更多次(与最大金额匹配)
(可能的)
--------------------------------------------------------------------------------
(?:组,但不捕获(可选)
(匹配尽可能多的金额):
--------------------------------------------------------------------------------
\[ '['
--------------------------------------------------------------------------------
[^\[\]]*除以下字符以外的任何字符:“\[”、“\]”(0或
更多次(与最多金额匹配)
(可能的)
--------------------------------------------------------------------------------
] ']'
--------------------------------------------------------------------------------
)? 分组结束
:
import java.util.regex.Matcher;
导入java.util.regex.Pattern;
公共班机{
公共静态void main(字符串[]args){
最后一个字符串regex=“[^\\[\\].]+(?:\\[[^\\[\\]]*])?”;
最终字符串String=“a.b.c.d[e.f.g]”;
最终模式=Pattern.compile(regex);
final Matcher Matcher=pattern.Matcher(字符串);
while(matcher.find()){
System.out.println(matcher.group(0));
}
}
}
这很挑剔(这可能无法解决),例如,递归[]不起作用:a.b.f[g.h[i.j]]
-对于正则表达式引擎来说,这确实不像是一项任务,但对于基本情况,这确实起作用。但在一般情况下,它不起作用。它只适用于最后一个要拆分的具有特殊大小写的术语的边缘大小写。您的示例是一个边缘大小写。如果正确的话,将示例更改为“a.b[x.y].c.d[e.f.g]”
拆分为[a,b[x.y],c,d[e.f.g]
,或者始终是内点始终是最后一项?
"\\.(?![^\\[\\]]*])"