簡體   English   中英

最有效的正則表達式,用於檢查字符串是否包含至少3個字母數字字符

[英]Most efficient regex for checking if a string contains at least 3 alphanumeric characters

我有這個正則表達式:

(?:.*[a-zA-Z0-9].*){3}

我用它來查看字符串中是否至少包含3個字母數字字符。 它似乎工作。

它應匹配的字符串示例:

'a3c'
'_0_c_8_'
' 9 9d '

但是,我需要它更快地工作。 有沒有更好的方法來使用正則表達式來匹配相同的模式?


編輯:我最終使用這個正則表達式為我的目的:

(?:[^a-zA-Z0-9]*[a-zA-Z0-9]){3}

(不需要修飾符)

最有效的正則表達式方法是使用對比原理 ,即並排使用相反的字符類。 這是一個正則表達式,可用於檢查字符串是否有3個拉丁字母或數字:

^(?:[^a-zA-Z0-9]*[a-zA-Z0-9]){3}

見演示

如果你需要一個完整的字符串匹配,你需要附加.* (或.*$如果你想保證你將匹配所有直到字符串/行的結尾),但在我的regexhero測試中, .* yield更好的性能):

^(?:[^a-zA-Z0-9]*[a-zA-Z0-9]){3}.*

此外,很大程度上取決於引擎。 PCRE具有自動優化功能,包括自動擁有(即它將**+ (?:[^a-zA-Z0-9]*+ )。

此處查看密碼驗證優化的更多詳細信息

(?:.*?[a-zA-Z0-9]){3}.*

你可以使用它。這比你的快得多,步驟也少。參見demo.You可能也想使用^$ anchors來確保沒有部分匹配。

https://regex101.com/r/nS2lT4/32

原因是

(?:.*[a-zA-Z0-9].*){3}

                ^^

這實際上消耗了整個字符串,然后引擎必須回溯。當使用其他正則表達式時,這是避免的

考慮一下。 正則表達式非常強大,因為它們具有表現力且非常靈活(具有前瞻,貪婪消耗和反向跟蹤等功能)。 幾乎總會有成本,無論多么微不足道。

如果你想要原始速度(並且你願意放棄表現力),你可能會發現完全繞過正則表達式並且僅僅評估字符串更快,例如使用以下偽代碼:

def hasThreeAlphaNums(str):
    alphanums = 0
    for pos = 0 to len(str) - 1:
        if str[pos] in set "[a-zA-Z0-9]":
            alphanums++
            if alphanums == 3:
                return true
    return false

它是一個解析器(在這種情況下非常簡單),一種比正則表達式強大的工具。 有關更具體的示例,請考慮以下C代碼:

#include <ctype.h>
int hasThreeAlphaNums (char *str) {
    int count = 0;
    for (int ch = *str; ch != '\0'; str++)
        if (isalnum (ch))
            if (++count == 3)
                return 1;
    return 0;
}

現在,關於這個特定情況是否更快,這取決於許多因素,例如語言是否被解釋或編譯,正則表達式的效率如何等等。

這就是為什么優化的口號是“測量,不要猜測!” 您應該評估目標環境中的可能性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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