正则表达总是困惑我。我以为我知道的足够多,但是当我试图使模式更加健壮时,我总是偶然发现我不知道的案例
在java中,我说有一个单词“BSD”。我想在“BSD”之前或之后检测出任何带有“许可”字样的句子。 “许可”字样是强制性的。 我如何在Java Regex中做到这一点?
据我所知。
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());
答案 0 :(得分:1)
如果您只想要一个Regex表达式来检查组合" ... GNU许可证......"和#34; ...许可证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",后跟任意数量的字符。
答案 1 :(得分:1)
您可以使用
检查字符串是否包含license
和GNU
(或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修饰符,则不包括换行符).*
- 在最后一次GNU
- 字面字符序列。