以中缀形式分割字符串

时间:2014-11-16 15:27:17

标签: java string text split

我想知道一些事情。我有功课,他们希望我们以多项式形式输入两个字符串输入,并且有很多实现。在这里我的问题是:当我从用户那里获取输入时,我可以将字符串拆分为多项式部分,但它出错了:

字符串:"-x^3 - 6x^2 + 4x + 22"

我想把它拆分成:

-x^3                      
- 6x^2 
+ 4x 
+ 22

但打印

package splitmethod;
import java.util.Scanner;
import java.io.*;

public class uygulama {

  public static void main(String args[]){


      System.out.println("lütfen parçalmak istidigniz polinomu girniz ");

      Scanner input= new Scanner(System.in);

      String polinom= input.nextLine();

      String[] result;

      System.out.println("");

      result=polinom.replaceAll("\\s+","").split("(?<=[+-])");

      for(int i=0;i<result.length;i++){

          System.out.println(result[i]);

4 个答案:

答案 0 :(得分:1)

(?<=[+-])表示在前面有+- 的地方进行拆分。所以对于像-x^3-6x^2+4x+22这样的数据你在这里分裂(我会用|标记这个地方)

-|x^3-|6x^2+|4x+|22

你想要的是在+- 之后拆分(并且不要在-或{{ 1}}放置在整个字符串的开头)。因此,您需要使用预见+而不是后视(?<=...)

示例:(?=...)其中|-x^3|-6x^2|+4x|+22表示要拆分的位置。如您所见,我还将|放在字符串的开头,因为它后面有|+

因此,请尝试使用-

如果您使用的是Java 8,您将得到正确的结果,因为zero-length(或零宽度)正则表达式匹配(如来自环视机制的那个),empty strings at start of result arrays are removed因此您不会结束使用split("(?=[+-])")数组,但是 ["", "-x^3", "-6x^2", "+4x", "+22"]

如果您使用的是早期版本的Java,则需要添加条件以防止在["-x^3", "-6x^2", "+4x", "+22"]元素之前匹配此|。您可以通过向正则表达式添加-x^3来确保匹配位置(在您的情况下为拆分位置)在字符串开始后不正确(由(?<!^)表示):

因此,在Java 8之前的版本中使用^


避免由于在String的开始处在split("(?=[+-])(?<!^)")上拆分而可能返回的空字符串的其他方法是使用另一个Scanner类实例和分隔符-,它将解析&#34;&#34;解析&#34} ;来自用户的输入,因此您的代码可能看起来像

(?=[+-])

输出:

String polinom = "-x^3 - 6x^2 + 4x + 22";//here you pass data from user

Scanner scanner = new Scanner(polinom);
scanner.useDelimiter("(?=[+-])");

while (scanner.hasNext())
    System.out.println(scanner.next());

scanner.close();

答案 1 :(得分:0)

我实际上并不认为您需要使用regex。只需遍历String就足够了,检查+/-就足够了。类似的东西:

StringBuilder sb = new StringBuilder();
for(int i=0;i<polinom.length;i++) {
    if(i!=0 && (polinom.charAt(i)=='-' || polinom.charAt(i)=='+')) {
        System.out.println(sb.toString());
        sb = new StringBuilder();
        sb.append(polinom.charAt(i));
    } else {
        sb.append(polinom.charAt(i));
    }
}
System.out.println(sb.toString());

所以基本上你缓冲polinom,当你遇到+-时,你知道多项式中的一个项已经结束。所以你打印缓冲区并启动一个新的缓冲区。

答案 2 :(得分:0)

正则表达式"(?<=[+-])"是&#34;正向背后&#34;。这意味着它会在<{1}}或+之后分开。你需要&#34;积极向前看&#34;,-

但是,无论如何,当您在执行此操作之前删除空格时,您将获得"(?=[+-])"+,而它们与操作数之间没有任何空格,

-

这不是你想说的。就个人而言,为了解析中缀操作,我会选择按空格分割,以便操作符与实际术语分开。

答案 3 :(得分:0)

import java.util.Scanner;
public class uygulama {
    public static void main(String args[]) {


      System.out.println("lütfen parçalmak istidigniz polinomu girniz ");

      Scanner input= new Scanner(System.in);

      String polinom= input.nextLine();

      String[] result;

      System.out.println("");

      result = polinom.split(" "); //just splits the words by space so the signs in front are not stored in the same array as the addressed variable/coefficient combo

      for(int i=0;i<result.length;i++){

          System.out.println(result[i]);
      }

    }

}