我一直在寻找堆栈溢出和各种其他网站来解决我的问题但是没有找到任何适合我的特定目的,并且无法更改这些解决方案以适应我的代码。这些包括我不完全理解或知道如何操作的正则表达式代码。
所以这是我的问题,我有一个结构的字符串:
"名称+"于:&#34 + +日期"注意:&#34 + meetingnotes"
(名称,日期和会议记录是变量)。我想要做的是提取字符串的日期部分并将其粘贴在Date变量中。日期的基本日期格式为" yyyy-MM-dd"。我该怎么做?
答案 0 :(得分:2)
为此,正则表达式是你的朋友:
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));
答案 1 :(得分:2)
日期模式识别算法,不仅可识别日期模式,还可以Java日期格式提取可能的日期。该算法非常快速且轻量级。处理时间是线性的,所有日期都在一次通过中识别。算法使用树遍历机制解析日期。树数据结构是自定义创建的,用于构建支持的日期,时间和月份模式。
该算法还确认日期文字之间的多个空格字符。例如。 DD DD DD和DD DD DD被视为有效日期。
以下日期模式被认为是有效的,并且可以使用此算法识别。
dd MM(MM)yy(yy)yy(yy)MM(MM)dd MM(MM)dd yy(yy)
其中M是月份字面值是字母格式,如Jan或January
日期之间允许的分隔符是' /',' \',' ',',',' |',' - ',' '
它还识别以下格式的尾随时间模式hh(24):mm:ss.SSS am / pm hh(24):mm:ss am / pm hh(24):mm:ss am / pm
分辨率时间是线性的,不使用模式匹配或强力。该算法基于树遍历并返回,日期列表具有以下三个组成部分 - 文本中标识的日期字符串 - 转换后的&格式化日期字符串 - SimpleDateFormat
使用日期字符串和格式字符串,用户可以根据需要自由地将字符串转换为对象。
算法库可在maven central获得。
<dependency>
<groupId>net.rationalminds</groupId>
<artifactId>DateParser</artifactId>
<version>0.3.0</version>
</dependency>
使用此示例代码如下所示。
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);
}
}
输出:[LocalDateModel {originalText = 2015-january-10 18:00:01.704,dateTimeString = 2015-1-10 18:00:01.704,conDateFormat = yyyy-MM-dd HH:mm:ss.SSS,start = 18,结束= 46}]
http://coffeefromme.blogspot.com/2015/10/how-to-extract-date-object-from-given.html
上的详细博客完整的来源可在GitHub https://github.com/vbhavsingh/DateParser
上找到答案 2 :(得分:1)
您可以像这样使用解析:
String fromDate = "2009/05/19";
DateFormat df = new SimpleDateFormat("yyyy/MM/dd");
java.util.Date dtt = df.parse(fromDate);
这会将任何(格式正确的)字符串转换为日期变量。
代码来自here
答案 3 :(得分:0)
以下是用于搜索字符串并将其解析为日期对象的实现程序。
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);
}
}
}
答案 4 :(得分:0)
正则表达式可能有点矫枉过正,尤其对初学程序员而言。
低技术但简单的方法是搜索围绕所需文字的两个已知部分:at:
和Notes:
。
如果您确定这些文本片段永远不会出现在其他文本中,您可以搜索每个片段以了解它们在整个字符串中的位置。使用String::indexOf
了解这些职位。然后使用String::substring`提取代表日期值的文本。
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格式符合标准ISO 8601格式。在解析/生成字符串时,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