[英]How do I create regular expression for a string to match [@username:4]?
[英]How do I determine if a string is not a regular expression?
我試圖提高一些代碼的性能。 它看起來像這樣:
public boolean isImportant(String token) {
for (Pattern pattern : patterns) {
return pattern.matches(token).find();
}
}
我注意到的是,許多模式似乎是簡單的字符串文字,沒有正則表達式構造。 所以我想簡單地將它們存儲在一個單獨的列表(importantList)中並進行相等測試,而不是執行更昂貴的模式匹配,如下所示:
public boolean isImportant(String token) {
if (importantList.contains(token)) return true;
for (Pattern pattern : patterns) {
return pattern.matches(token).find();
}
}
如何以編程方式確定特定字符串是否不包含正則表達式構造?
編輯:我應該補充一點,答案不需要對性能敏感。 (即可以使用正則表達式)我主要關注isImportant()的性能,因為它被調用了數百萬次,而模式的初始化只進行了一次。
我通常討厭這樣說但是......
不要那樣做。
它可能不會使代碼運行得更快,實際上它甚至可能導致程序花費更多時間。
如果你真的需要優化你的代碼,你可以去的地方可能會有很多更有效的地方。
這將很難。 您可以檢查是否存在任何正則表達式元字符; 這應該是一個很好的近似值:
Pattern regex = Pattern.compile("[$^()\\[\\]{}.*+?\\\\]");
Matcher regexMatcher = regex.matcher(subjectString);
regexIsLikely = regexMatcher.find();
是否值得這是另一個問題。 你確定正則表達式匹配比列表查找慢嗎(特別是因為在很多情況下你會在那之后進行正則表達式匹配)? 我敢打賭,保持正則表達式匹配要快得多。
沒有辦法確定它,因為每個正則表達式都只是一個字符串。 此外幾乎沒有性能差異,因為正則表達式現在很聰明,而且我很確定,如果模式和源長度相同,則股權檢查是第一次完成
這是錯的
for (Pattern pattern : patterns)
你應該創建一個ORs所有模式的大正則表達式; 那么對於每個輸入你只匹配一次。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.