在Java中如何从字符串中提取日期并将其放入日期变量中
我已经在stack overflow和各种其他网站上寻找我的问题的解决方案,但没有找到任何适合我的特定用途的解决方案,并且无法更改这些解决方案以适合我的代码。其中包括我不完全理解或不知道如何操作的正则表达式代码 这是我的问题,我有一个字符串,它有一个结构: “姓名+”在:“+日期+”备注:“+会议备注”在Java中如何从字符串中提取日期并将其放入日期变量中,java,regex,string,date,Java,Regex,String,Date,我已经在stack overflow和各种其他网站上寻找我的问题的解决方案,但没有找到任何适合我的特定用途的解决方案,并且无法更改这些解决方案以适合我的代码。其中包括我不完全理解或不知道如何操作的正则表达式代码 这是我的问题,我有一个字符串,它有一个结构: “姓名+”在:“+日期+”备注:“+会议备注” (姓名、日期和会议记录为变量)。我要做的是提取字符串的日期部分并将其粘贴到日期变量中。日期的基本日期格式为“yyyy-MM-dd”。我如何做到这一点?您可以像这样使用解析: String fro
(姓名、日期和会议记录为变量)。我要做的是提取字符串的日期部分并将其粘贴到日期变量中。日期的基本日期格式为“yyyy-MM-dd”。我如何做到这一点?您可以像这样使用解析:
String fromDate = "2009/05/19";
DateFormat df = new SimpleDateFormat("yyyy/MM/dd");
java.util.Date dtt = df.parse(fromDate);
这会将任何(格式良好的)字符串转换为日期变量
代码来自为此,正则表达式是您的朋友:
String input = "John Doe at:2016-01-16 Notes:This is a test";
String regex = " at:(\\d{4}-\\d{2}-\\d{2}) Notes:";
Matcher m = Pattern.compile(regex).matcher(input);
if (m.find()) {
Date date = new SimpleDateFormat("yyyy-MM-dd").parse(m.group(1));
// Use date here
} else {
// Bad input
}
或者在Java 8+中:
LocalDate date = LocalDate.parse(m.group(1));
下面是搜索字符串并将其解析为日期对象的实现程序
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class StringInBetween {
public static void main(String[] args) throws ParseException {
//"name+" at:"+Date+" Notes:"+meetingnotes" (name, Date and meetingnotes being variables).
String test = "rama"+ " at:"+"2015-01-02"+" Notes:"+"meetingnotes";
Pattern pattern = Pattern.compile("at:(.*)Notes");
Matcher matcher = pattern.matcher(test);
if(matcher.find())
{
String dateString = matcher.group(1); //I'm using the Capturing groups to capture only the value.
java.util.Date date = new SimpleDateFormat("yyyy-mm-dd").parse(dateString);
System.out.println(date);
}
}
}
正则表达式太过分了
对于这一点来说,正则表达式可能有些过分,特别是对于一个刚开始编程的人来说
低技术但简单的方法是搜索围绕所需文本的两个已知片段:at:
和Notes:
如果您确定这些文本片段不会出现在其他文本中,则可以搜索每个片段以了解它们在整个字符串中的位置。使用来学习这些位置。然后使用提取表示日期值的文本
String input = "John Doe at:2016-01-16 Notes:This is a test";
String at = "at:"; // We expect these two pieces of text to be embedded.
String notes = " Notes:";
// Verify that our expected pieces of text are indeed embedded.
if ( ! ( input.contains ( at ) && input.contains ( notes ) ) ) {
// …handle error…
System.out.println ( "ERROR - unexpected input" );
return;
}
int indexAt = input.indexOf ( at );
int indexNotes = input.indexOf ( notes );
String extracted = input.substring ( indexAt + at.length ( ), indexNotes );
LocalDate
获取提取的文本并对其进行解析,以获得LocalDate
对象。解析字符串以获取日期时间已涉及多次,请搜索StackOverflow以了解更多信息
您指定的yyyy MM dd格式符合标准格式。默认情况下,java.time类在解析/生成字符串时使用这些标准格式
LocalDate localDate = LocalDate.parse ( extracted );
System.out.println ( "extracted: " + extracted );
System.out.println ( "localDate.toString(): " + localDate );
摘自:2016-01-16
ld.toString():2016-01-16
一种日期模式识别算法,不仅可以识别日期模式,还可以提取Java日期格式的可能日期。该算法速度快,重量轻。处理时间是线性的,所有日期都在一次过程中确定。该算法使用树遍历机制解析数据。树数据结构是自定义创建的,用于构建受支持的日期、时间和月份模式 该算法还确认日期文字之间的多个空格字符。例如,DD和DD被视为有效日期 以下日期模式被认为是有效的,并且可以使用此算法识别 dd-MM(MM)yy(yy)yy(yy)MM(MM)dd-MM(MM)dd-yy(yy) 其中M是月份文字,是字母表格式,如一月或一月 日期之间允许的分隔符为“/”、“\”、“,”、“|”、“-”、“” 它还可以识别以下格式的尾随时间模式hh(24):mm:ss.SSS am/pm hh(24):mm:ss am/pm hh(24):mm:ss am/pm 解析时间是线性的,没有使用模式匹配或暴力。该算法基于树遍历并返回包含以下三个组件的日期列表-文本中标识的日期字符串-转换并格式化的日期字符串-SimpleDataFormat 使用日期字符串和格式字符串,用户可以根据自己的需求自由地将字符串转换为对象 算法库可在maven central获得
<dependency>
<groupId>net.rationalminds</groupId>
<artifactId>DateParser</artifactId>
<version>0.3.0</version>
</dependency>
net.rationalminds
完整的源代码可在GitHub上以日期格式(如MMddYYYY、ddMMyyyy等)获得,即API中不支持空格。此外,如果我们在日期之间有空格,则返回空白结果,如“test01/06/2020”。如果可能,包括这些格式并修复空间问题。。。。
import java.util.List;
import net.rationalminds.LocalDateModel;
import net.rationalminds.Parser;
public class Test {
public static void main(String[] args) throws Exception {
Parser parser=new Parser();
List<LocalDateModel> dates=parser.parse("Identified date :'2015-January-10 18:00:01.704', converted");
System.out.println(dates);
}
}