如何解决如何使用正则表达式输入用户的日期?
这是一个较大程序的一部分-我尽可能保持代码不变以检测错误。在这里,我有一系列的JTextField,用户可以使用欧洲格式输入“过去”日期(dd / MM / yyyy HH:mm等)。下面的按钮尝试将日期保存在数据库中(此处未实现)-但在此之前,它会检查格式是否正确。任何错误的格式或“未来”日期都应产生错误并使文本颜色变为红色。为了方便用户,如果一个人输入了日期/时间的一部分,则程序会尝试根据当前时间以及过去的日期来预测完整的日期。现在,除了一件事以外,一切都正常。如果用户仅输入“时间”(HH:mm),则除HH部分的最后一位以外的所有数字都将被截断,并被视为day(dd)。您能告诉我错误在哪里,以及如何纠正它吗? (我从另一篇文章中复制了正则表达式,并对其进行了修改-因此我对它不完全了解)。这是程序和输出(该程序于2020年1月4日上午8:00运行):
if(num&1)
comb = comb + s[i++];
num = num>>1;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.time.DateTimeException;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
public class InputDateTest implements ActionListener {
static int max = 15;
static JFrame f = new JFrame();
static GridBagLayout gb = new GridBagLayout();
static GridBagConstraints c = new GridBagConstraints();
static int presentLineNumber = 0;
static JTextField invDate[] = new JTextField[max];
static JButton b;
static LocalDateTime dates[] = new LocalDateTime[max];
int ready = 1,error = 0,atLeastOne = 0;
private static final Pattern date_pattern = Pattern
.compile("^\\s*((?:(?:\\d+(?:[./]\\s*)?){0,3})?)\\s*((?:(?:\\d+[:/.]?)+)?)");
public static void main(String[] args) {
InputDateTest idt = new InputDateTest();
f.setLayout(gb);
for(int i=0; i<max; i++) {
invDate[presentLineNumber] = new JTextField();
c.fill = GridBagConstraints.HORIZONTAL;
c.anchor = GridBagConstraints.FIRST_LINE_START;
c.gridx = 0;
c.gridy = presentLineNumber;
c.weightx = 0.1;
c.weighty = 0.0;
c.gridwidth = 1;
c.gridheight = 1;
gb.setConstraints(invDate[presentLineNumber],c);
f.add(invDate[presentLineNumber]);
presentLineNumber++;
}
b = new JButton("Save");
b.addActionListener(idt);
c.gridy = presentLineNumber+1;
gb.setConstraints(b,c);
f.add(b);
f.setLocation(400,100);
f.setSize(200,500);
f.setVisible(true);
f.revalidate();
f.repaint();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
@Override
public void actionPerformed(ActionEvent arg0) {
for(int i =0; i<presentLineNumber; i++) {
String str = invDate[i].getText();
invDate[i].setForeground(Color.BLACK);
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm");
LocalDateTime now = LocalDateTime.now( ZoneId.of( "Asia/Kolkata" ) );
dates[i] = now;
if(str!=null&&!str.isEmpty()) {
Matcher matcher = date_pattern.matcher(str);
if (matcher.matches()) {
try {
int yearAdjusted = 0,monthAdjusted = 0,dayAdjusted = 0;
String dateGroup = matcher.group(1).trim();
if (!"".equals(dateGroup)) {
String[] items = dateGroup.split("\\D+");
int len = items.length;
int y=now.getYear(),m=now.getMonthValue(),d=now.getDayOfMonth();
if(len>2) y = Integer.valueOf(items[2]);
if(len>1) m = Integer.valueOf(items[1]);
d = Integer.valueOf(items[0]);
int year = now.getYear();
if (y<100) y = y + year - (year%100);
if(len>2) {
if(now.getYear()>=y) {
dates[i] = dates[i].withYear(y);
yearAdjusted = 1;
}else {
error =1;
invDate[i].setForeground(Color.RED);
}
}
if(len>1) {
if(now.getMonthValue()>=m||now.getYear()>y) {
dates[i] = dates[i].withMonth(m);
monthAdjusted = 1;
}else if(yearAdjusted == 0){
dates[i] = dates[i].minusYears(1);
dates[i] = dates[i].withMonth(m);
y=y-1;
monthAdjusted = 1;
}else {
error =1;
invDate[i].setForeground(Color.RED);
}
}
if(len>0) {
if(now.getDayOfMonth()>=d||now.getMonthValue()>m||now.getYear()>y){
dates[i] = dates[i].withDayOfMonth(d);
dayAdjusted = 1;
}else if(monthAdjusted == 0) {
dates[i] = dates[i].minusMonths(1);
dates[i] = dates[i].withDayOfMonth(d);
dayAdjusted = 1;
}else if(yearAdjusted == 0){
dates[i] = dates[i].minusYears(1);
dates[i] = dates[i].withDayOfMonth(d);
dayAdjusted = 1;
}else {
error =1;
invDate[i].setForeground(Color.RED);
}
}
}
String timeGroup = matcher.group(2).trim();
if (!"".equals(timeGroup)) {
String[] items = timeGroup.split("\\D+");
int len = items.length;
if(len>0) dates[i] = dates[i].withHour(Integer.valueOf(items[0]));
if(len>1) dates[i] = dates[i].withMinute(Integer.valueOf(items[1]));
if(dates[i].isAfter(now)) {
if(dayAdjusted == 0) {
dates[i] = dates[i].minusHours(24);
}else {
error =1;
invDate[i].setForeground(Color.RED);
}
}
}
System.out.println("date = "+ dates[i].format(dtf));
} catch (DateTimeException d) {
error = 1;
invDate[i].setForeground(Color.RED);
}
}else {
error = 1;
invDate[i].setForeground(Color.RED);
}
}
}
if(atLeastOne == 0||error == 1) ready = 0;
System.out.println("");
}
}
解决方法
以下正则表达式的作用在于匹配日期模式:
"^\\s*((?:(?:\\d+(?![\\d:])(?:[./]\\s*)?){0,3})?)\\s*((?:(?:\\d+[:/.]?)+)?)"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。