【问题标题】:Regex for splitting a string to get operators用于拆分字符串以获取运算符的正则表达式
【发布时间】:2015-05-01 18:21:25
【问题描述】:

我有一个字符串 = A+B+CC-D0。 我想使用正则表达式将其拆分以获取操作数组 {+,+,-}

我试过正则表达式:

"[^+-]"

但是输出给了我一个 { ,+,+, ,+} 的数组,为什么?

    String s1 = "A+B+C-D";
    String s2 = "A0+B0";
    String[] op1 = s1.split([^+-]);
    String[] op2 = s2.split([^+-]);
    for(int i = 0; op1.length; i++){
        System.out.println(op1[i]);
    }

这是输出:

Output of op1:
""
"+"
"+"
""
"-"

Output of op2:
""
""
"+"

【问题讨论】:

  • 只删除数组中的空元素。
  • 是的,我可以,但是我需要额外的计算
  • 您可以开始匹配,而不是拆分。

标签: java arrays regex split operators


【解决方案1】:

问题是,您要拆分单个字符,而不是 + 或 -。当您拆分字符串 - ABC 时,它将被拆分 3 次 - 分别在 A、B 和 C 上,因此您将得到一个数组 - ["", "", "", ""]。

为避免此问题,请在正则表达式上使用量词:

String s1 = "A+B+C-D";
String s2 = "A0+B0";
String[] op1 = s1.split("[^+-]+");
String[] op2 = s2.split("[^+-]+");
System.out.println(Arrays.toString(op1));
System.out.println(Arrays.toString(op2));

这是在"[^+-]+" 上拆分。

现在要删除数组开头的空元素,您必须从字符串中删除第一个分隔符,使用 replaceFirst() 可能是:

String[] op1 = s1.replaceFirst("[^+-]+", "").split("[^+-]+");
System.out.println(Arrays.toString(op1)); // [+, +, -]

【讨论】:

  • 我不认为它在 Java 8 中已修复。我只是尝试过。也许我错过了什么。
  • 这也给了我一个额外的空元素。
  • 是的,我正在运行 java 8,但数组中仍有空白
  • @peter.petrov 是的,还没有修复。我想我更新了错误答案的修复程序。 :(
  • 它已在 Java 8 中修复(或“固定”不是正确的词,因为这种行为是预期的,“改进”是更好的词)但仅适用于零宽度分隔符,如 ""或环顾四周。
【解决方案2】:

将运算符以外的所有字符替换为空字符串,然后根据两个运算符之间存在的边界拆分结果字符串。

String s1 = "A+B+C-D";
String[] op1 = s1.replaceAll("[^+-]","").split("(?<=.)(?=.)");
for(String i: op1){
    System.out.println(i);
}

输出:

+
+
-
  • (?&lt;=.)positive lookbehind 断言匹配必须以字符开头。

  • (?=.)肯定的前瞻,它断言匹配必须后跟一个字符。

【讨论】:

  • 也许你应该解释一下 split("(?&lt;=.)(?=.)") 到底在做什么。这很神秘。仍然 +1,因为这很好用。
猜你喜欢
  • 1970-01-01
  • 2010-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多