import java.awt.Container;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class RegexStringTest extends JFrame
{
private static final long serialVersionUID = -1564020173888781534L;
private JTextField phoneTextField;
private JTextField zipTextField;
private JTextField addressTextField;
private JTextField firstTextField;
private JTextField lastTextField;
private JTextField chineseTextField;
private Font songTi = new Font("宋体",Font.PLAIN,12);
public RegexStringTest()
{
super("基于字符串的正则表达式");
//创建图形界面
JLabel phoneLabel = new JLabel("电话");
phoneLabel.setFont(songTi);
JLabel zipLabel = new JLabel("邮政编码");
zipLabel.setFont(songTi);
JLabel addressLabel = new JLabel("通信地址");
addressLabel.setFont(songTi);
JLabel firstLabel = new JLabel("First Name:(英文,第一个字母必须大写)");
firstLabel.setFont(songTi);
JLabel lastLabel = new JLabel("Last Name:(英文,第一个字母必须大写)");
lastLabel.setFont(songTi);
JLabel chineseLabel = new JLabel("中文");
chineseLabel.setFont(songTi);
JButton okButton = new JButton("验证");
okButton.setFont(songTi);
okButton.addActionListener(new ActionListener()
{
//内部类开始
public void actionPerformed(ActionEvent e) {
validateDate();
}//内部类结束
});//调用addActionListener结束
phoneTextField = new JTextField(15);
zipTextField = new JTextField(6);
addressTextField = new JTextField(35);
firstTextField = new JTextField(20);
lastTextField = new JTextField(20);
chineseTextField = new JTextField(30);
JPanel firstName = new JPanel();
firstName.add(firstLabel);
firstName.add(firstTextField);
JPanel lastName = new JPanel();
lastName.add(lastLabel);
lastName.add(lastTextField);
JPanel address = new JPanel();
address.add(addressLabel);
address.add(addressTextField);
JPanel zipAndPhone = new JPanel();
zipAndPhone.add(zipLabel);
zipAndPhone.add(zipTextField);
zipAndPhone.add(phoneLabel);
zipAndPhone.add(phoneTextField);
JPanel chinese = new JPanel();
chinese.add(chineseLabel);
chinese.add(chineseTextField);
JPanel ok = new JPanel();
ok.add(okButton);
//把GUI部件添加在容器中
Container container = getContentPane();
container.setLayout(new GridLayout(6,1));
container.add(firstName);
container.add(lastName);
container.add(address);
container.add(zipAndPhone);
container.add(chinese);
container.add(ok);
pack();
setVisible(true);
}//RegexStringTest构造器结束
public static void main(String args[])
{
RegexStringTest application = new RegexStringTest();
application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
/**
* 处理鼠标点击事件
*/
private void validateDate()
{
//确保每个文本框不为空
if(lastTextField.getText().equals("") ||
firstTextField.getText().equals("")||
addressTextField.getText().equals("")||
zipTextField.getText().equals("")||
phoneTextField.getText().equals("")||
chineseTextField.getText().equals(""))
{
JOptionPane.showMessageDialog(this, "每个栏目都必须填写");
}
else if(!firstTextField.getText().matches("[A-Z][a-zA-Z]*"))
{//验证First Name是不是以大写字母的一个英文单词
/*
* [A-Z]匹配单个大写字母,其后面的[a-zA-Z]*表示可以匹配任意数目的
* 字母。通常,在正则表达式中出现运算符(量词)"*"的时候,程序将匹配
* "*"前的0个或多个子表达式。同理,"A*"和"A+"都与"A"匹配,但"A*"
* 还可以匹配一个空的字符串。
*/
JOptionPane.showMessageDialog(this, "First Name非法");
}
else if(!lastTextField.getText().matches("[A-Z][a-zA-Z]*"))
{//验证Last Name是不是以大写字母开头的一个英文单词
JOptionPane.showMessageDialog(this, "Last Name非法");
}
else if(!addressTextField.getText().matches("\\d+\\s+([a-zA-Z]+|[a-zA-Z]+\\s[a-zA-Z]+)"))
{//验证地址是否为数字开始,并包含一个单词或者两个单词
/*
* 这里的地址格式是西方的格式,也就是门牌号在前,街名在后。
* \\d+\\s+([a-zA-Z]+|[a-zA-Z]+\\s[a-zA-Z]+)
* 首先是匹配任意的数字(\\d+),"\d"是表示数字字符,这里之所以要加上一个"\"
* 是因为"\"在Java中是作用转义字符的。所以这里的"\\d"就正好表示正则表达
* 式中的"\d"。然后,继续验证数字后面是否至少有一个空白字符(\\s+)。字符
* "|"将表达式与其左边或者右边的字符串相匹配。如:Hello(Tom|Rich)就和
* Hello Tom以及Hello Rich相匹配。括号用于将正则表达式的各个部分连接
* 起来。这里字符"|"左边([a-zA-Z]+)匹配一个单词,而右边
* ([a-zA-Z]+\\s[a-zA-Z]+)匹配两个单词,注意两个单词之间只能有一个空白
* 字符(\\s)。因此,这里如果用户输入"123 Main"或者"123 Main Street"
* 都是有效的。
*/
JOptionPane.showMessageDialog(this, "地址非法");
}
else if(!zipTextField.getText().matches("\\d{5}"))
{//验证邮政编码是否为一个5位数的数字
/*
* "\\d{5}"表明邮政编码匹配5个数字。另外可以用其他写法实现相同的功能
* 如:"[0-9]{5}"
*/
JOptionPane.showMessageDialog(this, "邮政编码非法");
}
else if(!phoneTextField.getText().matches("[1-9]\\d{2}-[1-9]\\d{2}-\\d{4}"))
{//验证电话号码格式是否为123-456-7890并且区号和电话号码的第一位不能是数字0
/*
* [1-9]\\d{2}-[1-9]\\d{2}-\\d{4}
* 本例采用的美国的电话号码形式,如123-456-7890,即头三位数字为区号
* ,之后紧跟一个短横线,接着是电话号码的头三位,之后又是一个短横线,
* 最后是电话号码的最后四位数。注意这里"[1-9]\\d{2}"表示匹配一个3位
* 数的数字,但其第一个数字不能为0.如果希望123-4567890这种格式的电话
* 号码也合法,可以修改"[1-9]\\d{2}-[1-9]\\d{2}-?\\d{4}"
* 我们在第2个短横线后加一个"?"号,表示"-"可以出现,也可以不出现。
*/
JOptionPane.showMessageDialog(this, "非法的电话号码");
}
else if(!chineseTextField.getText().matches("[\u4E00-\u9FA5]+"))
{
/*
* [\u4E00-\u9FA5]+,验证了用户输入的数据是否全部为中文字符。
*/
JOptionPane.showMessageDialog(this, "只能输入中文");
}
else
{
JOptionPane.showMessageDialog(this, "谢谢,您输入的完全合法");
}
}
}