Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于在另一个关键字后面或后面显示关键字的Java正则表达式_Java_Regex - Fatal编程技术网

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

用于在另一个关键字后面或后面显示关键字的Java正则表达式,java,regex,Java,Regex,Regex总是让我困惑。我想我知道的已经足够多了,但是当我试图使一个模式更加健壮时,我总是会遇到一些我不知道的情况 在java中,假设我有一个单词“BSD”。我想检测任何在单词“BSD”之前或之后有单词“license”的句子。“许可证”一词的出现是强制性的。 在Java正则表达式中如何做到这一点 这是据我所知 String REGEX = "(?i)(GNU)(\\s)+(license)?"; String contents1 = "This file is using GNU licens

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());

如果您只希望正则表达式检查“…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许可证”或“License GNU”,后跟任意数量的字符。

您可以使用

模式匹配:

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

那么,您想匹配一个字符串,该字符串以任意顺序同时包含
license
GNU
单词?例如,
String REGEX=“^(?=.*license)。*GNU”?你是说GNU吗?谢谢,它非常有趣@WiktorStribiżew。所以让我试着让你的正则表达式合理化。句子开始,并向前看单词anything后跟“license”,然后是anything GNUThank you@mind。但我认为越“放松”越好。
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!");
}