【问题标题】:Split string into overlapping parts将字符串拆分为重叠部分
【发布时间】:2013-06-01 19:34:19
【问题描述】:

我有这样的字符串:

String s = "1234567890";

我想使用 split("regex") 来获得这个输出:

12
23
34
45
56
67
78
89
90

我应该使用什么正则表达式?

【问题讨论】:

  • 在循环中使用substring(from, to) 而不是正则表达式...
  • 有些人在遇到问题时会想“我知道,我会使用正则表达式。” 现在他们有两个问题。 ——杰米·扎温斯基

标签: java regex string split


【解决方案1】:

这不是用正则表达式解决的合适问题

当有更简单的方法来解决问题时,最重要的是 更明显和自我记录的方式来做到这一点。

public static void main(final String[] args)
{
    final String s = "1234567890";
    for (int i = 0; i < s.length() - 1; i++)
    {
        System.out.println(s.substring(i,i+2));
    }
}

12
23
34
45
56
67
78
89
90

有些人在遇到问题时会想 “我知道,我会使用正则表达式。” 现在他们有两个问题。 ——杰米·扎温斯基

【讨论】:

  • 您可以轻松修复一次性错误并帮助所有人
  • 我可以。但是,正如我总是告诉代表较少的用户,应该在 IDE 中编写代码并将其粘贴到此处以避免语法和其他明显错误。这段代码可以很容易地运行并检查给定问题的正确性。
  • 为什么这不是用正则表达式解决的合适问题?你没有解释为什么,这并不明显......至少对我来说不是
  • 解释在答案中“当有更简单的方法来解决问题时。”
  • 正则表达式很简单“(?=(\\d{2}))”,代码不再长。那么它是如何更简单或更容易的呢?我想这似乎很主观
【解决方案2】:

我同意Jarrods answer,如果您不必使用正则表达式并且还有其他简单的解决方案,那么请尽量避免使用正则表达式。但是如果您必须使用它,请阅读我的其余答案...

很遗憾,您将无法使用 split 进行此操作,因为您想在几个拆分部分中使用相同的数字,这是不可能的,因为拆分无法将新内容添加到数据中。

你可以通过前瞻机制来做到这一点

String data = "1234567890";
Matcher m = Pattern.compile("(?=(\\d\\d))").matcher(data);
while (m.find())
    System.out.println(m.group(1));

输出:

12
23
34
45
56
67
78
89
90

【讨论】:

  • +1,将问题重命名为Split string into overlapping parts,以便更好地找到它。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多