2013-06-18 89 views
-3

我有3个值IU,PRIRET。如果我的输入字符串包含任何一个或多个值,那么Java正则表达式应该返回true。Java正则表达式字匹配

Ex: 
Values : IU PRI RET 
Input String : "put returns UI between paragraphs" 

输入字符串包含“UI”字,Java正则表达式应该返回true。

+1

这不是那么简单,'IU | PRI | RET' O_O? – HamZa

+0

我认为OP也希望IU | PRI | RET的所有字符都匹配,因此根据规格匹配“UI”字。 – Mena

回答

8

你需要word boundaries为:

boolean foundMatch = false; 
Pattern regex = Pattern.compile("\\b(?:UI|PRI|RET)\\b"); 
Matcher regexMatcher = regex.matcher(subjectString); 
foundMatch = regexMatcher.find(); 
3

尝试

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 
0

确定这里是与每个给定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 
1

我不知道,如果你还在寻找这样的解决方案。但这是你的问题的代码。我认为你正在寻找的字谜用空格分开,单词出现在大写字母中。

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}) 
0

你可以在一行中做到这一点,并得到你的布尔值。

boolean matcher = Pattern.matches("[UI]{2}|[PRI]{3}|[RET]{3}", stringToBeMatched);