【问题标题】:java string split regular expression retain delimiterjava字符串拆分正则表达式保留分隔符
【发布时间】:2014-11-22 11:22:23
【问题描述】:

给出一个输入字符串,例如

"abbbcaababbbcaaabbca"

我想将这样一个字符串拆分成一组数组“bca”“ab”“a”和“b

所以上面的例子会返回

"ab", "b", "bca", "ab", "ab", "b", "bca", "a", "ab", "bca".

我有一段 29 行的嵌套循环代码来完成这项任务(返回 ArrayList)。 不过,最好用一行正则表达式来完成。

这个任务可以用下面的方法完成吗?

stringVar.split("regEX") 

【问题讨论】:

  • 这里的拆分规则/要求是什么?
  • 你的要求是什么?到目前为止你做了什么?
  • 我不相信 split 会做你想做的事。
  • 这种拆分有什么一般规则吗?我虽然关于使用split("(?<=(\\w))(?=\\1)")之类的东西在相同字符之间进行拆分,但这不会将abab拆分为abab

标签: java arrays regex string


【解决方案1】:

不是单行的,但您可以使用带有循环的Matcher.find 来完成。:

ArrayList<String> result = new ArrayList<String>();
String s = "abbbcaababbbcaaabbca";
Matcher m = Pattern.compile("bca|ab|a|b").matcher(s);
while (m.find())
    result.add(m.group());

DEMO

【讨论】:

    【解决方案2】:

    可以使用lookaround assertions 来完成,但@falsetru 的答案比splitting 更受欢迎。

    String[] ss = "abbbcaababbbcaaabbca".split("(?<=bca|ab)|(?<=a(?=ab))|(?<=b(?=bca))");
    System.out.println(Arrays.toString(ss)); //=> [ab, b, bca, ab, ab, b, bca, a, ab, bca]
    

    如果字符串只包含字母,您可以使用反向引用缩短它。

    String[] ss = "abbbcaababbbcaaabbca".split("(?<=bca|ab)|(?<=(.)(?=\\1))")
    

    【讨论】:

    • 使用零宽度拆分是一项挑战。非常不错!
    【解决方案3】:

    您似乎正试图在相同的字符之间进行拆分。在这种情况下,您可以使用

    stringVar.split("(?<=(\\w))(?=\\1)") 
    

    但是会导致ab, b, bca, abab, b, bca, a, ab, bca,也就是说abab不会被拆分。

    如果您愿意,您可以手动添加大小写,您可以决定在 abbca 之后您还想通过

    拆分
    stringVar.split("(?<=(\\w))(?=\\1)|(?<=ab|bca)") 
    

    现在将返回ab, b, bca, ab, ab, b, bca, a, ab, bca

    【讨论】:

      猜你喜欢
      • 2011-02-24
      • 2012-08-13
      • 1970-01-01
      • 2012-06-29
      • 2013-09-27
      • 1970-01-01
      • 2013-07-06
      相关资源
      最近更新 更多