【问题标题】:splitting string in infix form以中缀形式拆分字符串
【发布时间】:2014-11-16 15:27:17
【问题描述】:

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

字符串:"-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]);

【问题讨论】:

  • 请花更多时间重写您的问题。
  • Aleady 5th version of the question,但没有人修复标题...
  • 你的代码没有编译,你还没有说实际的输出是什么。你可能应该解决这些问题。
  • 不,我的代码有效,我写了我想打印的内容

标签: java string text split


【解决方案1】:

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

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

你想要的是在有+- 在它之后的地方分割(并且不要在-+ 放置在整个字符串的开头) .因此,您需要使用前瞻(?=...),而不是后视(?&lt;=...)

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

所以尝试使用split("(?=[+-])")

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

如果您使用的是早期版本的 Java,则需要添加条件以防止在 -x^3 元素之前匹配第一个 |。您可以通过将(?&lt;!^) 添加到您的正则表达式来确保匹配位置(在您的情况下是拆分位置)在字符串开始之后(由^ 表示)不是正确的:

所以在 Java 8 之前的版本中使用 split("(?=[+-])(?&lt;!^)")


避免由于在 String 开头在 - 上拆分而可能返回的空字符串的其他方法是使用另一个带有分隔符 (?=[+-]) 的 Scanner 类实例,它将“解析”来自用户的输入,因此您的代码可以看起来像

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();

输出:

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

【讨论】:

  • 非常感谢,我一直在寻找几个小时来找到这个解决方案:D
【解决方案2】:

我实际上认为您不需要使用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 并且每当你遇到+- 你知道多项式中的一项已经结束。所以你打印缓冲区并开始一个新的缓冲区。

【讨论】:

    【解决方案3】:
    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]);
          }
    
        }
    
    }
    

    【讨论】:

      【解决方案4】:

      正则表达式"(?&lt;=[+-])" 是“积极的后视”。这意味着它将+- 之后拆分。你需要“积极的前瞻”,"(?=[+-])"

      但无论如何,当您在执行此操作之前删除空格时,您将得到 +-,它们与操作数之间没有任何空格,

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-09-08
        • 1970-01-01
        • 2014-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多