如何匹配字符串末尾的正斜杠或句点但不使用 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