正则表达式:跳过第一次出现的模式

时间:2011-08-11 15:00:54

标签: java regex

假设我有一个字符串foo,其值由空格分隔:

  • [value 1] [value 2] [value 3] ... [value n]

正则表达式对split(...) foo的作用是什么,这样生成的String数组包含除value 1之外的所有值?这甚至可能吗?

这是我到目前为止所拥有的:

  • String[] array = foo.split("\\s");

这并不多,我知道。


编辑:

我希望通过正则表达式完成这项工作。如果无法做到这一点,请告诉我!

4 个答案:

答案 0 :(得分:3)

将字符串拆分为值数组后,循环遍历数组并执行所需操作,跳过第一次迭代。

for(i=1; i<array.count(); i++){
    //Act on the data value
}

答案 1 :(得分:2)

你的分隔符可能“是字符串开头的空格序列或非ws的块,但这会在前面留下一个空字符串:

Arrays.toString("abc def  ghi   jkl".split("\\s+|^\\S+\\s+"))

产生

[,def,ghi]

这是split的问题 - 我认为,你会在数组的开头总是得到的东西。不幸的是,我认为你需要在拆分之前敲掉字符串的前面,或者使用Java的Arrays.copyOfRange()或类似的后处理。

可以使用replaceFirst

完成删除
import java.util.Arrays;
public class SplitExample {

    public static final String data = "abc   def  ghi";
    public static void main(String[] args) {
        System.out.println(Arrays.toString(data.split("\\s+")));
        System.out.println(Arrays.toString(data.split("\\s+|^\\S+\\s+")));
        System.out.println(Arrays.toString(data.replaceFirst("^\\S+\\s+", "").split("\\s+")));
    }
}

最后一行尽可能接近,因为split会产生匹配 AROUND 您的分隔符。如何通过单个拆分避免前面的空白字符串?我不确定有办法......

答案 2 :(得分:0)

你能做到吗?

String[] array = foo.split("\\S*\\s")[1].split("\\s");

它是2个正则表达式分裂而不是1个,但它比后来循环更整洁。我不确定它是否正确,但它应该首先将字符串分成“任意数量的非空格字符后跟空格”以及其他所有内容。然后你可以只用空格分割其他所有东西,你将留下一个不包括第一个元素的数组。

编辑:是的,单个拆分无法完成,因为除了“”以外的任何东西作为数组中的第一个元素的唯一方法是拥有一些你不是用字符串前面的分割删除。

答案 3 :(得分:0)

由于共识似乎是不可能的,我提出这个解决方案:

假设你在'垃圾'值中只有一个空格,

int ix = theString.indexOf(" ");
ix = theString.indexOf(" ", ix);
theString.substring(ix + 1).split("\\s");

这从字符串中的第二个空格获取子字符串('junk'值中空格后的第一个空格)然后将其拆分。