【问题标题】:Split string in Java to show only sequence of characters在Java中拆分字符串以仅显示字符序列
【发布时间】:2012-12-19 20:09:59
【问题描述】:

我正在尝试像下面的字符串那样拆分字符串

3x2y3+5x2w3–8x2w3z4+3-2x2w3+9y–4xw–x2x3+8x2w3z4–4

到一个没有任何数字或符号的字符串表。

意思是

a[0]=x
a[1]=y
a[2]=x
a[3]=w

我试过了

split("(\\+|\\-|\\d)+\\d*")

但是好像不行。

【问题讨论】:

  • 我不明白你的问题?
  • 你能举一个更详细的例子吗?根据给定的输入,你的结果应该是什么样子?
  • 所以您只是在寻找字母? “xw”应该保持在一起还是分开呢?
  • 我希望他们在一起
  • 是我还是减号–8x2w3z4+3-2x2w3+9y不一样?

标签: java regex split


【解决方案1】:

以下应该有效:

String[] letters = input.split("[-+\\d]+");

【讨论】:

  • 这将导致数组中有许多空字符串,这是由于将两个背靠背数字分开。
  • @RohitJain 你能举个例子还是正则表达式已经修复?
  • @PeterLawrey ..啊!是的,我的坏。它会正常工作。实际上我使用了错误的正则表达式。但为什么这被否决了?
  • 抱歉,您的解决方案不符合要求。例如,您的解决方案不包括括号,要求不包括!
  • @stefanbachert.. 现在好了。根据要求。
【解决方案2】:

编辑:-

如果您希望 xw 一起出现在结果数组中,那么您需要拆分字符串:-

String[] arr = str.split("[-+\\d]+");

输出:-

[, x, y, x, w, x, w, z, x, w, y, xw, x, x, x, w, z]

您可以用空字符串替换所有不需要的字符,并在空字符串上拆分。

String str = "3x2y3+5x2w3-8x2w3z4+3-2x2w3+9y-4xw-x2x3+8x2w3z4-4";
str = str.replaceAll("[-+\\d]", "");        
String[] arr = str.split("");       
System.out.println(Arrays.toString(arr));

请注意,这将添加一个空字符串作为您可以处理的数组的第一个元素。

输出:-

[, x, y, x, w, x, w, z, x, w, y, x, w, x, x, x, w, z]

请注意,- 登录您的问题是不同的。您应该将其替换为键盘上的那个。目前它与- 符号不匹配。

【讨论】:

    【解决方案3】:

    这一条线可以做所有事情:

    String[] letters = input.replaceAll("(^[^a-z]*)|([^a-z]*$)", "").split("[^a-z]+");
    

    这也处理前导/尾随字符,因此您不会在数组的开头得到空白元素(就像其他一些答案一样)

    用你的字符串测试:

    public static void main(String[] args) {
        String input = "3x2y3+5x2w3–8x2w3z4+3-2x2w3+9y–4xw–x2x3+8x2w3z4–4";
        String[] letters = input.replaceAll("(^[^a-z]*)|([^a-z]*$)", "").split("[^a-z]+");
        System.out.println(Arrays.toString(letters));
    }
    

    输出:

    [x, y, x, w, x, w, z, x, w, y, xw, x, x, x, w, z]
    

    请注意,数组中没有前导“空白”元素

    【讨论】:

    • 感谢您的回答。但是它不起作用。是的,它保留了数字
    • 我不明白,为什么要保留数字?
    • @DoubleGras 我最初有"[^\\w]+",但我将其更改为"[^a-z]+" 以解决问题
    • 我就是这么想的。所以,赞成这个最简单的答案。
    • @Anonymous 您可能想再次查看此答案。我已经提炼了它。它仍然只有一条线,但它也有花里胡哨。
    【解决方案4】:
    String[] letters = input.split("[\\d\\+\\-]+");
    

    【讨论】:

    • 你不需要转义+-
    【解决方案5】:

    这是你想要达到的目标吗?

     String data="3x2y3+5x2w3–8x2w3z4+3-2x2w3+9y–4xw–x2x3+8x2w3z4–4";
    
     //lets replace all unnecessary elements with spaces
     data=data.replaceAll("[-+–\\d]", " ");
     // now string looks like:
     // " x y   x w   x w z     x w   y  xw x x   x w z   "
    
     // lets remove spaces from start and end
     data=data.trim();
     // data looks like:
     // "x y   x w   x w z     x w   y  xw x x   x w z"
    
     // and split in places where is at least one space
     String[] arr=data.split("\\s+");
    
     System.out.println(Arrays.toString(arr));
    

    输出:

    [x, y, x, w, x, w, z, x, w, y, xw, x, x, x, w, z]
    

    【讨论】:

      【解决方案6】:

      remark - 和 - 不是同一个代码,一个只是 ascii 减去另一个是 long(编码 UTF8 e28093)

      public class Test {
          public static void main(String pArgs[])
          {
              String s="3x2y3+5x2w3–8x2w3z4+3-2x2w3+9y–4xw–x2x3+8x2w3z4–4";
              String splitreg="(\\+|\\-|\\d|–)+\\d*";     if ( pArgs.length > 0 )
                  {
                      splitreg=pArgs[0];
              }
              System.out.println("splitting '" + s + "' with '"  + splitreg + "'"); 
              String[] splitted=s.split(splitreg);
              for (int i=0; i < splitted.length; i++ )
                  {
                      System.out.println("["+ i + "]" + "=" + splitted[i]);
                  }
          }
      }
      

      /usr/lib/jvm/java-1.7.0-openjdk-amd64/bin/java 测试

      splitting '3x2y3+5x2w3–8x2w3z4+3-2x2w3+9y–4xw–x2x3+8x2w3z4–4' with '(\+|\-|\d|–)+\d*'
      [0]=
      [1]=x
      [2]=y
      [3]=x
      [4]=w
      [5]=x
      [6]=w
      [7]=z
      [8]=x
      [9]=w
      [10]=y
      [11]=xw
      [12]=x
      [13]=x
      [14]=x
      [15]=w
      [16]=z
      

      【讨论】:

      • 在我的情况下是这样(复制粘贴它)。初始字符串中有两个减号,一个是普通的 ascii,另一个是文字编辑器(即 - UTF8 代码:e28093,这 - 不是你可以在键盘上找到的那个,我想您是通过复制粘贴博客或 wiki 获得的...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-30
      • 2012-03-21
      • 2013-02-07
      相关资源
      最近更新 更多