【问题标题】:Split String when character changes. Possible Regex solution? [duplicate]字符更改时拆分字符串。可能的正则表达式解决方案? [复制]
【发布时间】:2013-02-12 15:20:51
【问题描述】:

我有一些只包含数字的Strings,我想在字符发生变化时对其进行拆分。

例如:

  • "11101100112021120" 转至:{"111", "11", "11", "2", "2", "11", "2"}
  • "222222222" 转到 {"222222222"}
  • "222222122" 转到{"222222", "1", "22"}
  • "000000000" 转至 {}
  • "0000100000" 转到{"1"}
  • "11121222212112133321" 转到 {"111", "2", "1", "2222", "1", "2", "11", "2", "1", "333", "2", "1"}

我想要一个很好的方法来做到这一点。

我知道解决此问题的两种方法:暴力破解或逐段添加。或者,我可以删除所有的 0 并替换为 0,然后在字符更改时添加 0,然后只对 0 进行拆分,但这两种方式看起来都很愚蠢。如果有人对更好/更漂亮的方法(正则表达式或逻辑)有任何想法,那就太好了。

【问题讨论】:

  • 顺便说一句,谷歌链接表示赞赏。我找不到任何有效的搜索词。此外,我将这些保存在 ArrayList 或任何其他简单的方式访问它们。
  • 您应该将您的要求更改为 我有一些仅由数字组成的字符串,并且我想在字符更改时将其拆分 并且在数字 0 上,以匹配您的示例。

标签: java regex string character


【解决方案1】:

这似乎像你期望的那样工作

data.split("0+|(?<=([1-9]))(?=[1-9])(?!\\1)");

测试:

String[] tests = { "11101100112021120", "222222222", "222222122",
        "000000000", "0000100000", "11121222212112133321" };

for (String data : tests) {
    System.out.println(data + " ->" + Arrays.toString(data.split("0+|(?<=([1-9]))(?=[1-9])(?!\\1)")));
    System.out.println("-----------------------");
}

输出:

11101100112021120 ->[111, 11, 11, 2, 2, 11, 2]
-----------------------
222222222 ->[222222222]
-----------------------
222222122 ->[222222, 1, 22]
-----------------------
000000000 ->[]
-----------------------
0000100000 ->[, 1]     // <-- only problem - empty first element 
-----------------------
11121222212112133321 ->[111, 2, 1, 2222, 1, 2, 11, 2, 1, 333, 2, 1]
-----------------------

不幸的是,前导零会让数组包含额外的空字符串。要摆脱它,您可以提前使用 data.replaceFirst("^0+(?=[^0])", "") 删除这些零

【讨论】:

  • 这很好用,非常感谢!
  • 请注意,对于一个全为零的字符串,执行replaceFirst("^0+", "") 将导致拆分生成一个包含一个空字符串的数组。尝试replaceFirst("^0+(?=[^0])", "") 仅在字符串以零开头但不是 all 零时进行替换。
  • @matts 不错。很难看出 Arrays.toString() -> [] 的结果是空数组还是只有一个空字符串的数组 :)
【解决方案2】:

试试

 str.split( "0+|(?<=(\\d))(?!\\1)" )

对于包含零的字符串,您必须遍历数组并删除所有空元素。

【讨论】:

  • 这就像说的那样工作,你会有空/空元素,这很好,但是 Pshemo 不会产生空元素,但非常感谢!
猜你喜欢
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-19
  • 2011-06-18
相关资源
最近更新 更多