[英]Java regular expression word match
我有3個值IU,PRI和RET 。 如果我的輸入字符串包含一個或多個值,
Java正則表達式應返回true。
Ex:
Values : IU PRI RET
Input String : "put returns UI between paragraphs"
輸入字符串包含“ UI”字樣,Java正則表達式應返回true。
為此,您需要單詞邊界 :
boolean foundMatch = false;
Pattern regex = Pattern.compile("\\b(?:UI|PRI|RET)\\b");
Matcher regexMatcher = regex.matcher(subjectString);
foundMatch = regexMatcher.find();
嘗試
String s= "A IU somehting PRI something RET whatever";
Pattern p= Pattern.compile("(IU|PRI|RET)");
Matcher m= p.matcher(s);
while (m.find()) {
String matched= m.group(1);
System.out.println(matched);
}
它打印:
IU
PRI
RET
我不知道您是否還在尋找解決方案。 但是,這是您的問題代碼。 我假設您要查找的字謎之間用空格隔開,並且單詞以大寫形式出現。
String text = "put returns UI between IU paragraphs PRI RIP and RET ETR";
Pattern p = Pattern.compile("([UI]{2}|[PRI]{3}|[RET]{3})");
Matcher m = p.matcher(text);
System.out.println(m.find());
如果嘗試不區分大小寫的匹配,請將模式更改為以下格式;
(?i)([UI]{2}|[PRI]{3}|[RET]{3})
好的,這是一個瘋狂的解決方案,其中包含每個給定String
字謎,它們內置在Pattern
只是為了好玩:
public static void main(String[] args) {
try {
Pattern pattern = makePattern("IU", "PRI", "RET");
System.out.println(pattern.pattern());
String test = "put returns UI between paragraphs, also IRP and TER";
Matcher matcher = pattern.matcher(test);
while (matcher.find()) {
System.out.println(matcher.group());
}
}
catch (Exception e) {
e.printStackTrace();
}
}
public static Pattern makePattern(String... words) throws Exception {
if (words == null || words.length == 0) {
throw new Exception("TODO handle invalid argument");
}
StringBuilder patternBuilder = new StringBuilder("(");
for (String word : words) {
if (word == null || word.isEmpty()) {
throw new Exception("TODO invalid word");
}
for (String anagram: doAnagrams(word, null)) {
patternBuilder.append("\\b").append(anagram).append("\\b").append("|");
}
}
patternBuilder.deleteCharAt(patternBuilder.length() - 1);
patternBuilder.append(")");
return Pattern.compile(patternBuilder.toString());
}
public static Set<String> doAnagrams(String original, Set<String> processed) {
if (original == null || original.isEmpty()) {
return new LinkedHashSet<String>();
}
Set<String> result;
if (processed == null) {
result = new LinkedHashSet<String>();
result.add(original);
} else {
result = processed;
}
if (original.length() <= 1) {
return result;
}
String sub = original.substring(1);
String subStart = original.substring(0, 1);
for (String subAnagram : doAnagrams(sub, null)) {
result.add(subAnagram.concat(subStart));
}
if (sub.concat(original.substring(0, 1)).equals(result.iterator().next())) {
return result;
}
else {
return doAnagrams(sub.concat(subStart), result);
}
}
輸出 :
(\bIU\b|\bUI\b|\bPRI\b|\bRIP\b|\bIRP\b|\bIPR\b|\bPIR\b|\bRPI\b|\bRET\b|\bETR\b|\bTER\b|\bTRE\b|\bRTE\b|\bERT\b)
UI
IRP
TER
您可以在一行中完成此操作,然后獲取布爾值。
boolean matcher = Pattern.matches("[UI]{2}|[PRI]{3}|[RET]{3}", stringToBeMatched);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.