我在理解正则表达式如何匹配文本但不包括找到的匹配文本时遇到了问题。也许我需要与组一起工作,但我没有这样做,因为我通常看到术语非捕获组被使用。
目标是说我在日志文件中的ticket如下。
TICKETAADMIN05MAR2020/。 只返回 AADMIN05MAR2020 或如果 滴滴打车工程2020年3月5日。只返回 AENGINEERING05MAR02020 去掉"/"或". "的地方
最后要忽略这样的台词:"TICKET BEEN COMPLET"。
Java demo
using regex = "(?<=^TICKET\\s{0,2}/).*(?://|\\.)?
1. The regex demo has Javascript selected for the demo only
// used in the import statement: import java.util.regex.Matcher;
// import java.util.regex.Pattern;
private static void testRegex() {
String ticket1 = "TICKET/A/ITSUPPORT/05MAR2020//";
String ticket2 = "TICKET /B/ADMIN/06MAR2020.";
String ticket3 = "TICKET/C/GENERAL/07MAR2020";
//https://www.regular-expressions.info/brackets.html
String regex = "(?<=^TICKET\\s{0,2}/).*(?://|\\.)?";
Pattern pat = Pattern.compile(regex);
Matcher mat = pat.matcher(ticket1);
if (mat.find()) {
String myticket = ticket1.substring(mat.start(), mat.end());
System.out.println(myticket+ ", Expect 'A/ITSUPPORT/05MAR2020'");
}
mat = pat.matcher(ticket2);
if (mat.find()) {
String myticket = ticket2.substring(mat.start(), mat.end());
System.out.println(myticket+", Expect 'B/ADMIN/06MAR2020'");
}
mat = pat.matcher(ticket3);
if (mat.find()) {
String myticket = ticket3.substring(mat.start(), mat.end());
System.out.println(myticket+", Expect 'C/GENERAL/07MAR2020'");
}
regex = "(//|\\.)";
pat = Pattern.compile(regex);
mat = pat.matcher(ticket1);
if (mat.find()) {
String myticket = ticket1.substring(mat.start(), mat.end());
System.out.println(myticket+", "+mat.start() + ", " + mat.end() + ", " + mat.groupCount());
}
}
Output of the updated pattern with your code:
A/ITSUPPORT/05MAR2020//, Expect 'A/ITSUPPORT/05MAR2020
B/ADMIN/06MAR2020., Expect 'B/ADMIN/06MAR2020
C/GENERAL/07MAR2020, Expect 'C/GENERAL/07MAR2020
//, 28, 30, 1
所以告诉解析器在字符串的开始处寻找TICKET,然后是一个斜杠,但不要返回TICKET。在字符串的结尾处查找双斜线"/"或". "和句号,但这是可选的。
我的Java 1.8.x代码如下。
//
我在理解正则表达式为什么可以匹配文本,但不包括找到的匹配文本时有问题。也许我需要与组一起工作,我没有这样做,因为我通常看到 ....
你可以在模式末尾使用一个正向的看头,而不是匹配。.*?
该 lookahead 断言字符串末尾的内容是一个可选的字符串。
(?<=^TICKET\s{0,2}/).*?(?=(?://|\.)?$)
或
(?<=
由于点和双前斜线是可选的,你必须使 ^
不贪心。TICKET\s{0,2}/
在部分/
)
正面看后方,断言左边的东西是.*?
字符串的开始(?=
Match TICKET和0-2个空白字符,后面是 (?:
近距离观察|
匹配除换行符以外的任何字符0+次,尽可能少(非贪婪的)。$
//
正面看,断言右边的东西是。|
交替的非捕获组 \.
因为二者都可以接上 )?
第2场比赛向前斜线$
或)
匹配一个点关闭非捕获组并使其成为可选的
String regex = "(?<=^TICKET\\s{0,2}/).*?(?=(?://|\\.)?$)";
断言字符串的结束 关闭正面展望在Java中Regex演示 1