如何使用两个分隔符拆分字符串,其中一个是双制表符?

时间:2014-06-12 19:36:26

标签: java split

我在java中创建一个解析器,我正在解析的内容由一个制表符分隔,并且在某一点上它被双制表符分隔。

这是我尝试过的。输出仅显示为由一个选项卡分割。

这是我要拆分的代码:

String[] array1 = nextline.split("(\t)|(\t{2})");

我也试过

String[] array1 = nextline.split("(\t)|(\t\t)");

2 个答案:

答案 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}")