如何匹配字符串末尾的正斜杠或句点但不使用 Java 正则表达式捕获
How to match forward slashes or periods at end of String but Not Capture Using Java Regular Expression
我无法理解正则表达式如何匹配文本但不包含找到的匹配文本。也许我需要与我不在做的组一起工作,因为我经常看到使用非捕获组这个词。
目标是说我在日志文件中有如下票证:
TICKET/A/ADMIN/05MAR2020// 到 return 只有 A/ADMIN/05MAR2020
或者如果
TICKET/A/ENGINEERING/05MAR2020。到 return 仅 A/ENGINEERING/05MAR02020
其中“//”或“。”已删除
最后忽略像这样的行:
票已完成
using regex = "(?<=^TICKET\s{0,2}/).*(?://|\.)?
因此告诉解析器在字符串开头查找 TICKET,后跟正斜杠,但不要 return TICKET。并寻找双正斜杠“//”或“。”字符串末尾的句点,但将其设为可选。
我的Java1.8.x代码如下:
// 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());
}
}
我的实际结果如下:
A/ITSUPPORT/05MAR2020//, Expect 'A/ITSUPPORT/05MAR2020
B/ADMIN/06MAR2020., Expect 'B/ADMIN/06MAR2020
C/GENERAL/07MAR2020, Expect 'C/GENERAL/07MAR2020
//, 28, 30, 1
如有任何建议,我们将不胜感激。请注意,长期以来一直在从 Whosebug 学习但第一次进入,希望问题被适当地提出。谢谢。
您可以在模式末尾使用正先行而不是匹配。
前瞻断言字符串末尾的内容是可选的 //
或 .
由于点和双正斜杠是可选的,因此您必须使 .*?
非贪婪。
(?<=^TICKET\s{0,2}/).*?(?=(?://|\.)?$)
部分
(?<=
正向后视,断言左边的是
^
字符串开头
TICKET\s{0,2}/
匹配 TICKET 和 0-2 个空白字符后跟 /
)
关闭回顾
.*?
匹配除换行符之外的任何字符 0+ 次,尽可能少(非贪婪)
(?=
正向前瞻,断言右边的是
(?:
交替的非捕获组 |
因为两者后面都可以跟 $
//
匹配 2 个正斜杠
|
或
\.
匹配一个点
)?
关闭非捕获组并使其可选
$
断言字符串结束
)
关闭正先行
在Java
String regex = "(?<=^TICKET\s{0,2}/).*?(?=(?://|\.)?$)";
Regex demo 1 | Java demo
1.正则表达式演示只为演示选择了 Java脚本
使用您的代码输出更新后的模式:
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/A/ADMIN/05MAR2020// 到 return 只有 A/ADMIN/05MAR2020
或者如果
TICKET/A/ENGINEERING/05MAR2020。到 return 仅 A/ENGINEERING/05MAR02020
其中“//”或“。”已删除
最后忽略像这样的行:
票已完成
using regex = "(?<=^TICKET\s{0,2}/).*(?://|\.)?
因此告诉解析器在字符串开头查找 TICKET,后跟正斜杠,但不要 return TICKET。并寻找双正斜杠“//”或“。”字符串末尾的句点,但将其设为可选。
我的Java1.8.x代码如下:
// 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());
}
}
我的实际结果如下:
A/ITSUPPORT/05MAR2020//, Expect 'A/ITSUPPORT/05MAR2020
B/ADMIN/06MAR2020., Expect 'B/ADMIN/06MAR2020
C/GENERAL/07MAR2020, Expect 'C/GENERAL/07MAR2020
//, 28, 30, 1
如有任何建议,我们将不胜感激。请注意,长期以来一直在从 Whosebug 学习但第一次进入,希望问题被适当地提出。谢谢。
您可以在模式末尾使用正先行而不是匹配。
前瞻断言字符串末尾的内容是可选的 //
或 .
由于点和双正斜杠是可选的,因此您必须使 .*?
非贪婪。
(?<=^TICKET\s{0,2}/).*?(?=(?://|\.)?$)
部分
(?<=
正向后视,断言左边的是^
字符串开头TICKET\s{0,2}/
匹配 TICKET 和 0-2 个空白字符后跟/
)
关闭回顾.*?
匹配除换行符之外的任何字符 0+ 次,尽可能少(非贪婪)(?=
正向前瞻,断言右边的是(?:
交替的非捕获组|
因为两者后面都可以跟$
//
匹配 2 个正斜杠|
或\.
匹配一个点
)?
关闭非捕获组并使其可选$
断言字符串结束
)
关闭正先行
在Java
String regex = "(?<=^TICKET\s{0,2}/).*?(?=(?://|\.)?$)";
Regex demo 1 | Java demo
1.正则表达式演示只为演示选择了 Java脚本
使用您的代码输出更新后的模式:
A/ITSUPPORT/05MAR2020, Expect 'A/ITSUPPORT/05MAR2020'
B/ADMIN/06MAR2020, Expect 'B/ADMIN/06MAR2020'
C/GENERAL/07MAR2020, Expect 'C/GENERAL/07MAR2020'
//, 28, 30, 1