Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.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_String_Date - Fatal编程技术网

在Java中如何从字符串中提取日期并将其放入日期变量中

在Java中如何从字符串中提取日期并将其放入日期变量中,java,regex,string,date,Java,Regex,String,Date,我已经在stack overflow和各种其他网站上寻找我的问题的解决方案,但没有找到任何适合我的特定用途的解决方案,并且无法更改这些解决方案以适合我的代码。其中包括我不完全理解或不知道如何操作的正则表达式代码 这是我的问题,我有一个字符串,它有一个结构: “姓名+”在:“+日期+”备注:“+会议备注” (姓名、日期和会议记录为变量)。我要做的是提取字符串的日期部分并将其粘贴到日期变量中。日期的基本日期格式为“yyyy-MM-dd”。我如何做到这一点?您可以像这样使用解析: String fro

我已经在stack overflow和各种其他网站上寻找我的问题的解决方案,但没有找到任何适合我的特定用途的解决方案,并且无法更改这些解决方案以适合我的代码。其中包括我不完全理解或不知道如何操作的正则表达式代码

这是我的问题,我有一个字符串,它有一个结构:

“姓名+”在:“+日期+”备注:“+会议备注”


(姓名、日期和会议记录为变量)。我要做的是提取字符串的日期部分并将其粘贴到日期变量中。日期的基本日期格式为“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);  
   }  
 }