2015-05-14 76 views
-1

我在寫一個Java應用程序,用戶可以根據用戶提供的過濾器減少字符串列表。使用星號字符搜索文本的正則表達式

因此,例如,用戶可以輸入一個過濾器,例如:

ABC*xyz 

這意味着用戶正在尋找與ABC開始,有跟隨XYZ字符串(這將是一樣的做搜索ABC*xyz*

過濾器,用戶可以輸入的另一個實例是:

*DEF*mno*rst 

這意味着字符串可以與幹啥開始g,但它必須跟隨DEF,然後是mno,然後是rst。

我該如何編寫Java代碼才能生成正則表達式,我需要弄清楚我的字符串是否與用戶指定的過濾器匹配?

+0

查看http://www.rgagnon.com/javadetails/java-0515.html – Shar1er80

+0

'*'轉換爲'。*'('ABC * xyz' - >'ABC。* xyz')所以有什麼問題? –

回答

1

如果轉換您的語法正則表達式,這是「容易」的方式來做到這一點(避免寫一個詞法分析器自己),你必須記得適當地逃脫你的字符串。

所以,如果要沿着這條路,你應該瞄準引述比特在你的語法不通配符(如果你希望你的*表示「至少一個字符或.+)用正則表達式.*加盟這種使用*.()和所有其他的正則表達式的特殊字符時,將避免不正確的結果

試着這麼做:

public Pattern createPatternFromSearch(String query) { 
    StringBuilder sb = new StringBuilder(); 
    for (String part : query.split("\\*")) { 
     if (part.length() > 0) { 
      sb.append(Pattern.quote(part)); 
     } 
     sb.append(".*"); 
    } 
    return Pattern.compile(sb.toString()); 
} 

// ... 

// then you can use it like.... 
Matcher matcher = createPatternFromQuery("*DEF*mno*rst").matcher(str); 
if (matcher.matches()) { 
    // process the matching result 
} 

請注意,通過使用Matcher#matches()(而不是find)並保留尾部.*,它將迎合僅在起始處錨定的語法。

+0

在這個解決方案中沒有'\ *'序列(除了字面意義,不會被誤解 - 這不是[Pattern.quote](http://docs.oracle.com/javase/7/docs/ api/java/util/regex/Pattern.html#quote%28java.lang.String%29)作品。 – declension

+0

OK - 謝謝:)。 – declension

+0

謝謝,這個解決方案效果很好! –

-1

*替換爲.*並且您有正則表達式。

String str = "*DEF*mno*rst"; 
String regex = str.replaceAll("*", ".*"); 
+1

不,這在一般情況下不起作用:它不是固定在_only_開始處,它不處理任何特殊的正則表達式字符('*','?','。','|','< '''''''''''',''''''''''''等) – declension

+0

我同意@Nick B.我們可能想要轉義特殊的正則表達式字符,這會使它變得有點複雜。 – abhishrp

相關問題