我在java中创建一个解析器,我正在解析的内容由一个制表符分隔,并且在某一点上它被双制表符分隔。
这是我尝试过的。输出仅显示为由一个选项卡分割。
这是我要拆分的代码:
String[] array1 = nextline.split("(\t)|(\t{2})");
我也试过
String[] array1 = nextline.split("(\t)|(\t\t)");
答案 0 :(得分:6)
\\t{1,2}
怎么样?
public static void main(String[] args) {
String s = "ONE\tTWO\t\tTHREE";
String[] d = s.split("\\t{1,2}");
for(String e : d) {
System.out.println(e);
}
}
输出应为
ONE
TWO
THREE
如果您需要拆分任意数量的标签,那么您应该使用
\\t+
如果您需要拆分任何空格,那么
\\s+
答案 1 :(得分:2)
如果您在正则表达式中使用Foo|FooFoo
,那么基于从左到右执行正则表达式的事实,正则表达式引擎会尝试在Foo
之前匹配FooFoo
。因此,即使字符串将包含来自正则表达式的FooFoo
Foo
,也将首先使用,因为它将匹配(两次)正则表达式引擎,因此不需要检查正则表达式FooFoo
中的其他变体。
因此,如果你想分开Foo|FooFoo
,那么正则表达式会拆分这个地方
ABCFooBARFooFooDEF
\|/ \|/\|/
| | +-----match
| +--------another match
+--------------and another match
所以这个字符串将以这种方式分割
ABC|BAR||DEF
生成数组
["ABC", "Bar", "", "DEF"]
要解决此问题,您几乎没有选择。
FooFoo
创建Foo
之前移动FooFoo|Foo
,因此FooFoo
Foo
Foo{1,2}
这样的贪婪量词,这意味着“尝试在一到两Foo
之间选择尽可能多的(贪婪)”。所以你可以试试
split("\t\t|\t")
split("\t{1,2}")
。