Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果有其他方法不起作用?_Java_Regex_If Statement_Jbutton_Actionlistener - Fatal编程技术网

Java 如果有其他方法不起作用?

Java 如果有其他方法不起作用?,java,regex,if-statement,jbutton,actionlistener,Java,Regex,If Statement,Jbutton,Actionlistener,我的操作侦听器中的If-Else语句工作不正常 按下Jbutton时,如果用户输入了数字为0-9和+-*/的字符串,则程序正确执行 否则,JOptionPane将显示一条错误消息 在下面的代码中,它似乎跳过了If条件,并直接转到Else不管发生什么 如果您决定编译此代码.. 示例后缀:11+在转换为中缀时等于(1+1) Main package p2gui; import javax.swing.JButton; import javax.swing.JFrame; import ja

我的操作侦听器中的
If-Else
语句工作不正常

按下Jbutton时,如果用户输入了数字为
0-9
+-*/
的字符串,则程序正确执行

否则,JOptionPane将显示一条错误消息

在下面的代码中,它似乎跳过了
If
条件,并直接转到
Else
不管发生什么

如果您决定编译此代码..
示例后缀:11+在转换为中缀时等于(1+1)

Main

    package p2gui;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import java.awt.event.*;
import javax.swing.JOptionPane;

/**
 *
 * @author Mike
 */
public class P2GUI extends JFrame implements ActionListener {

    JFrame f = new JFrame("Three Address Generator");// Title

    private final JButton evaluate;
    private final JLabel textfieldLabel;
    private final JTextField entryField;
    private final JLabel resutfieldlabel;
    private final JTextField resultField;
    private final JOptionPane popup = new JOptionPane();

    P2GUI() {

        f.setSize(425, 180);
        f.setLayout(null);//using no layout managers  
        f.setVisible(true);//making the frame visible  //window size
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        textfieldLabel = new JLabel("Enter Postfix Expression");
        f.add(textfieldLabel);
        textfieldLabel.setBounds(10, 10, 160, 25);

        entryField = new JTextField("");
        //entryField.addActionListener(this);//ActionListener
        f.add(entryField);
        entryField.setBounds(160, 10, 220, 25);

        evaluate = new JButton("Construct Tree");

        evaluate.addActionListener(this);//ActionListener
        f.add(evaluate);
        evaluate.setBounds(137, 55, 130, 30);

        resutfieldlabel = new JLabel(" Infix Expression ");
        f.add(resutfieldlabel);
        resutfieldlabel.setBounds(20, 100, 100, 25);

        resultField = new JTextField("");
        //resultField.addActionListener(this);//ActionListener
        resultField.setEditable(false);
        f.add(resultField);

        resultField.setBounds(125, 100, 220, 25);
    }

            @Override
            public void actionPerformed(ActionEvent e) {
                String fullString;
                fullString = entryField.getText().trim();
        if(fullString.matches("\\d+") && fullString.matches("[-+*/]")){

            Convert conversion = new Convert();
                    resultField.setText(conversion.convert(fullString));

        } else {
            JOptionPane.showMessageDialog(null, "Please Enter Digit and 
  Arithmetic operator");        
            //eraseTextField();

                }

            }

    public void eraseTextField() {
        entryField.setText("");
        entryField.requestFocus();
    }

    public static void main(String[] args) {
        P2GUI p1GUI;
        p1GUI = new P2GUI();

    }
}
/////////////////////////////////////////////END///////////////////////////////////////////////////////////////////////////////   
隐蔽类

package p2gui;

import java.util.Stack;
import javax.swing.JOptionPane;

/**
 *
 * @author Mike
 */

public class Convert {

    /**
     * Checks if the input is operator or not
     * @param c input to be checked
     * @return true if operator
     */
 private boolean operator(char c){
  return c == '+' || c == '-' || c == '*' || c =='/' || c == '^';
    }

    /**
     * Converts any postfix to infix
     * @param postfix String expression to be converted
     * @return String infix expression produced
     */
 public String convert(String postfix){
  Stack<String> stackIt = new Stack<>();

        for (int i = 0; i < postfix.length(); i++) {
            char c = postfix.charAt(i);
            if (operator(c)) {
                String b = stackIt.pop();
                String a = stackIt.pop();
                stackIt.push("(" + a + c + b + ")");
            } else {
                stackIt.push("" + c);
            }
        }
        return stackIt.pop();
    }
}
包p2gui;
导入java.util.Stack;
导入javax.swing.JOptionPane;
/**
*
*@作者迈克
*/
公共类转换{
/**
*检查输入是否为运算符
*@param c要检查的输入
*@return true if运算符
*/
专用布尔运算符(字符c){
返回c='+'| | c='-'| | c='*'| | c='/'| | c='^';
}
/**
*将任何后缀转换为中缀
*要转换的@param后缀字符串表达式
*@返回字符串中缀表达式已生成
*/
公共字符串转换(字符串后缀){
Stack stackIt=新堆栈();
for(int i=0;i
您正在使用的正则表达式
字符串
“\\d+”
检查
字符串
是否仅包含数字,但您需要检查它是否也包含运算符。以下正则表达式应足够(需要一位数字和一个运算符):


匹配
检查字符串作为一个整体是否与正则表达式匹配。如果要检查字符串中的匹配项,则需要在表达式的两端添加
*

if (fullString.matches(".*\\d+.*") && fullString.matches(".*[-+*/].*")){
,允许用户输入任何内容,只要其中至少有一个数字,并且至少有一个运算符。他们可以输入任何他们喜欢的内容,只要它包含这两个部分

如果要检查他们是否只输入了数字和运算符,并且每个数字和运算符至少输入了一个:

if (fullString.matches("[-+*/\\d]+") && fullString.matches(".*\\d.*") && fullString.matches(".*[-+*/].*")){
也就是说,“只有数字和运算符,以及至少一个数字和至少一个运算符,以任何顺序。”


我不知道您是否要将其锁定更多(数字然后是运算符,或运算符然后是数字;只有一个运算符;不允许数字,然后是运算符,然后是更多数字;等等),但所讨论的
if
的基本问题是“整个字符串”注意,一个变量只能包含一个值,这是OR和and中的陷阱operator@abcOfJava:否,OP正在尝试确定字符串是否包含数字和运算符。这要求字符串的数字后跟运算符,但其在
convert
中的代码似乎允许任何顺序(事实上,对于组合)。(我不知道这是
convert
中的问题还是故意的。)@t.J.Crowder谢谢,刚刚编辑了它。我需要复习一下我的正则表达式!谢谢t.J它现在可以工作了。我想它真的很小
if (fullString.matches("[-+*/\\d]+") && fullString.matches(".*\\d.*") && fullString.matches(".*[-+*/].*")){