有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用于在另一个关键字后面或后面显示关键字的Java正则表达式

Regex总是让我困惑。我想我知道的已经足够多了,但是当我试图使一个模式更加健壮时,我总是会遇到一些我不知道的情况

在java中,假设我有一个单词“BSD”。我想检测任何在单词“BSD”之前或之后有单词“license”的句子。“许可证”一词的出现是强制性的。 在Java正则表达式中如何做到这一点

这是据我所知

String REGEX = "(?i)(GNU)(\\s)+(license)?";
String contents1 = "This file is using GNU license.";
m = Pattern.compile(REGEX).matcher(contents1);
m.find();
System.out.println(m.group());

String contents2 = "This  licensed using GNU version 2 .";
m = Pattern.compile(REGEX).matcher(contents2);
m.find(); 
System.out.println(m.group());

共 (2) 个答案

  1. # 1 楼答案

    您可以使用以下命令检查字符串是否同时包含licenseGNU(或BSD,您使用的内容取决于您的数据和需要匹配的内容)

    String REGEX = "^(?=.*license).*GNU";
    String contents1 = "This  licensed using GNU version 2 .";
    Matcher m = Pattern.compile(REGEX).matcher(contents1);
    if (m.find()) {
        System.out.println("Found!");
    }
    

    this Java demo

    模式匹配:

    • ^-字符串的开头
    • (?=.*license)-正向前瞻,在任何0+字符之后需要一系列文字字符license(如果未使用dotall修饰符,则不包括换行字符)
    • .*-任何0+个字符,直到最后一个
    • GNU-一个文本字符序列
  2. # 2 楼答案

    如果你只是想用一个正则表达式来检查组合“…GNU许可证…”以及“…许可GNU…”你可以试试这样:

    String a = "abc GNU License 213";
    String b = "abc License GNU 123";
    
    Pattern patternA = Pattern.compile("^.*(((GNU)\\s(License))|((License)\\s(GNU))).*$");
    Matcher matcherA = patternA.matcher(a);
    
        if (matcherA.matches()) {
            System.out.println("matcherA matched");
        }
    
    Pattern patternB = Pattern.compile("^.*(((GNU)\\s(License))|((License)\\s(GNU))).*$");
    Matcher matcherB = patternB.matcher(b);
    
        if (matcherB.matches()) {
            System.out.println("matcherB matched");
        }
    

    它匹配任意数量的字符,后跟“GNU许可证”或“许可证GNU”,后跟任意数量的字符