Java 正则表达式模式与数据和日期匹配 我只需要在文件名的起始处筛选出与[LCKI]或OpNy]匹配的字符串,而不考虑其他任何地方。

Java 正则表达式模式与数据和日期匹配 我只需要在文件名的起始处筛选出与[LCKI]或OpNy]匹配的字符串,而不考虑其他任何地方。,java,regex,pattern-matching,Java,Regex,Pattern Matching,源字符串示例: LCK_card_L02NOR19999_2012-11-07-121600 [Invalid/Filter it] BLTM_L183ROP3289_2012-11-07-121601 [Valid one] TEMP_LCK_card_L02NOR19999_2012-11-07-121600 [Valid one] 我试着这样做: LCK_|OPN_ 但它也和TEMP_LCK_uuxxxxx匹配 如何组合我的请求[忽略LCK或OPN和提取日期]的模式 用于日期提取的我的

源字符串示例:

LCK_card_L02NOR19999_2012-11-07-121600 [Invalid/Filter it]
BLTM_L183ROP3289_2012-11-07-121601 [Valid one]
TEMP_LCK_card_L02NOR19999_2012-11-07-121600 [Valid one]
我试着这样做:

LCK_|OPN_
但它也和TEMP_LCK_uuxxxxx匹配

如何组合我的请求[忽略LCK或OPN和提取日期]的模式

用于日期提取的我的正则表达式模式

(19|20)\\d\\d[-](0[1-9]|1[012])[-](0[1-9]|[12][0-9]|3[01])[-]\\d\\d\\d\\d\\d\\d]
^(LCK|OPN|)
-
^
表示输入的开始

要将其与正则表达式的其余部分结合起来,请跳过任意数量的任意字符:

^(?:LCK_|OPN_).*(19|20)\\d\\d.....
(使用
?:
如果您不想将
LCK_
OPN_
捕获到一个组中)。

^(LCK_124;OPN)
-
^
代表输入的开始

要将其与正则表达式的其余部分结合起来,请跳过任意数量的任意字符:

^(?:LCK_|OPN_).*(19|20)\\d\\d.....

(如果不想将
LCK_
OPN_
捕获到一个组中,请使用
?:

文件的开头,还是行的开头

试试这个

"^(LCK_|OPN_).*"

文件的开头,还是行的开头

试试这个

"^(LCK_|OPN_).*"
考虑以下代码:

String[] strs = new String[] {
    "LCK_card_L02NOR19999_2012-11-07-121600", // Invalid
    "BLTM_L183ROP3289_2012-11-07-121601", // Valid one
    "TEMP_LCK_card_L02NOR19999_2012-11-07-121600" // Valid one
};

String pattern = "^(?!(LCK_|OPN_))(.*)((19|20)[0-9]{2}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])-[0-9]{6}).*";

for (String string : strs) {
    boolean m = string.matches(pattern);
    System.out.println(m ? "Valid" : "Invalid");
}
这将首先匹配字符串的开头(由
^
表示),然后匹配除
LCK\u
OPN\u
之外的任何内容(由
?!
表示),然后匹配0个或多个任意字符,然后匹配日期模式,然后可能匹配多个字符。

考虑以下代码:

String[] strs = new String[] {
    "LCK_card_L02NOR19999_2012-11-07-121600", // Invalid
    "BLTM_L183ROP3289_2012-11-07-121601", // Valid one
    "TEMP_LCK_card_L02NOR19999_2012-11-07-121600" // Valid one
};

String pattern = "^(?!(LCK_|OPN_))(.*)((19|20)[0-9]{2}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])-[0-9]{6}).*";

for (String string : strs) {
    boolean m = string.matches(pattern);
    System.out.println(m ? "Valid" : "Invalid");
}

这将首先匹配字符串的开头(由
^
表示),然后匹配除
LCK\u
OPN\u
以外的任何内容(由
?!
表示),然后匹配0个或更多任意字符,然后匹配日期模式,然后可能匹配多个字符。

谢谢。我更新了我的问题。我正在努力合并它们,请检查更新的答案。使用
*
跳过不相关的输入。我尝试了^(?:LCK|OPN |)。*(19 | 20)\\d\\d[-](0[1-9]| 1[012])[-](0[1-9]|[12][0-9]|[3[01])[-]\\d\\d\\d\\d\\d\\d\\d临时LCK|2012-11-07-121600[例如]不匹配,这很好,对吗?你在抱怨“但它也和TEMP_LCK_uuxxxxx匹配。”谢谢。我更新了我的问题。我正在努力合并它们,请检查更新的答案。使用
*
跳过不相关的输入。我尝试了^(?:LCK|OPN |)。*(19 | 20)\\d\\d[-](0[1-9]| 1[012])[-](0[1-9]|[12][0-9]|[3[01])[-]\\d\\d\\d\\d\\d\\d\\d临时LCK|2012-11-07-121600[例如]不匹配,这很好,对吗?你在抱怨“但它也匹配TEMP_LCK_uuxxxxx”。不匹配LCK_2012-11-07-121600,无论如何,如果以LCK_uo开头,它应该拒绝,所以我要求提供一种模式,它将过滤不以LCK_uo开头且匹配日期的字符串pattern@NitinGurram:再试一次。它在这三个示例字符串中对我有效。不匹配LCK_2012-11-07-121600无论如何,如果以LCK_开头,它应该拒绝。因此,我要求提供一种模式,该模式将过滤不以LCK_开头的字符串并匹配日期pattern@NitinGurram:再试一次。它在这三个示例字符串中对我有效。