簡體   English   中英

如何確定字符串是否不是正則表達式?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM