Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正则表达式在不在括号内的点上拆分字符串_Java_Regex - Fatal编程技术网

Java 正则表达式在不在括号内的点上拆分字符串

Java 正则表达式在不在括号内的点上拆分字符串,java,regex,Java,Regex,正如标题所说,我想写一个正则表达式r,这样 Splitter.onPattern(r.splitToList)(“a.b.c.d[e.f.g]”)导致 [a, b, c, d[e.f.g]] 我一直在胡闹,想把它弄对,但弄不清楚。我认为“\\。((?!\\[)*)\\]*”应该是有效的(匹配任何后跟不包含“[”且以“]”结尾的字符串的点),但出于某种原因,它仍然会在所有点上分裂。对于所显示的示例,请尝试以下内容,同时假设[和]是平衡的,而不是嵌套的 \.(?![^[]*]) 这是你的电话号码

正如标题所说,我想写一个正则表达式r,这样
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]
,或者始终是内点始终是最后一项?
"\\.(?![^\\[\\]]*])"