【问题标题】:Java String.split() RegexJava String.split() 正则表达式
【发布时间】:2012-04-09 01:24:39
【问题描述】:

我有一个字符串:

String str = "a + b - c * d / e < f > g >= h <= i == j";

我想在所有运算符上拆分字符串,但将运算符包含在数组中,因此生成的数组如下所示:

[a , +,  b , -,  c , *,  d , /,  e , <,  f , >,  g , >=,  h , <=,  i , ==,  j]

我目前有这个:

public static void main(String[] args) {
    String str = "a + b - c * d / e < f > g >= h <= i == j";
    String reg = "((?<=[<=|>=|==|\\+|\\*|\\-|<|>|/|=])|(?=[<=|>=|==|\\+|\\*|\\-|<|>|/|=]))";

    String[] res = str.split(reg);
    System.out.println(Arrays.toString(res));
}

这非常接近,它给出了:

[a , +,  b , -,  c , *,  d , /,  e , <,  f , >,  g , >, =,  h , <, =,  i , =, =,  j]

我可以做些什么来让多个字符运算符像我希望的那样出现在数组中?

作为一个不那么重要的次要问题,正则表达式中有没有办法从字母周围修剪空白?

【问题讨论】:

  • 您可以在示例表达式中用空格分隔以获得您想要的结果。
  • 对于您的第二个问题:字符串具有修剪功能:docs.oracle.com/javase/7/docs/api/java/lang/String.html#trim()
  • @Jeffrey:空间不一定存在。为了便于阅读,我在其中有空格,但它可以是空格的任意组合,也可以没有。不过感谢您的想法!
  • @user306848:是的,我知道修剪,我只是好奇它是否可能在正则表达式中。不过感谢您的提示!

标签: java regex string split


【解决方案1】:
String[] ops = str.split("\\s*[a-zA-Z]+\\s*");
String[] notops = str.split("\\s*[^a-zA-Z]+\\s*");
String[] res = new String[ops.length+notops.length-1];
for(int i=0; i<res.length; i++) res[i] = i%2==0 ? notops[i/2] : ops[i/2+1];

应该这样做。一切都很好地存储在res

【讨论】:

  • 是的,这行得通,只需从数组中剥离前导元素(为空)
  • 回来后,这似乎是最好的方法。我想在正则表达式中完成它,但这会完美地工作。谢谢!
  • 有什么解释吗?
【解决方案2】:
str.split (" ") 
res27: Array[java.lang.String] = Array(a, +, b, -, c, *, d, /, e, <, f, >, g, >=, h, <=, i, ==, j)

【讨论】:

    【解决方案3】:
        String str = "a + b - c * d / e < f > g >= h <= i == j";
        String reg = "\\s*[a-zA-Z]+";
    
        String[] res = str.split(reg);
        for (String out : res) {
            if (!"".equals(out)) {
                System.out.print(out);
            }
        }
    

    输出:+ - * / >=

    【讨论】:

      【解决方案4】:

      您可以使用 \b 在单词边界上拆分

      【讨论】:

      • 你试过了吗?你会有问题的。
      • 好吧,我承认,我在 .NET 中对其进行了测试,它确实有效。删除空条目应该是微不足道的,并且在应用正则表达式之前使用 .replaceAll 删除字符串中的空格肯定很容易完成。
      【解决方案5】:

      你能反转你的正则表达式,这样被非操作字符分割吗?

      String ops[] = string.split("[a-z]")
      // ops == [+, -, *, /, <, >, >=, <=, == ]   
      

      这显然不会返回数组中的变量。也许你可以交错两个拆分(一个由运算符,一个由变量)

      【讨论】:

      • 虽然不是确切的解决方案,但它确实给了我有效的想法!谢谢!我将编辑解决方案的主要帖子!
      【解决方案6】:

      你也可以这样做:

      String str = "a + b - c * d / e < f > g >= h <= i == j";
      String[] arr = str.split("(?<=\\G(\\w+(?!\\w+)|==|<=|>=|\\+|/|\\*|-|(<|>)(?!=)))\\s*");
      

      它处理可变长度的空格和单词并生成数组:

      [a, +, b, -, c, *, d, /, e, <, f, >, g, >=, h, <=, i, ==, j]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-02
        • 2019-03-30
        • 2011-09-16
        • 1970-01-01
        • 2015-12-29
        • 2022-12-17
        • 2016-09-28
        • 2013-01-18
        相关资源
        最近更新 更多