2015-10-17 52 views
2

我試圖讓用戶註冊一個只包含字母(任何語言),數字或連字符的用戶名。我正在嘗試檢查用戶名是否違反了此規則。正則表達式匹配除字母數字字符或連字符之外的任何字符

到目前爲止,這是工作,以找出是否一個用戶名不只包含字母數字字符:

REFindNoCase('^[[:alnum:]]', ARGUMENTS.Username) 

這很好,因爲如果我得到一個發現的結果,那麼我知道它的一個無效的用戶名格式裏面有特殊字符。但我也想讓連字符通過。我怎麼能表達正則表達式像(僞代碼如下):

REFindNoCase('^[[:alnum:]\-]', ARGUMENTS.Username) 

因爲我用它使用標準的主要的ColdFusion我只能用Perl的正則表達式兼容。

+0

PCRE不Perl的。固定標籤。 – ikegami

+0

@ikegami ColdFusion支持只與Perl兼容的正則表達式 –

+2

這是不可能的。它可能使用與Perl不同的「Perl兼容正則表達式」(PCRE)引擎。 – ikegami

回答

4

首先,你錯了REFindNoCase('^[[:alnum:]]', ARGUMENTS.Username)罰款。它檢查第一個字符是否是alphnumeric。

$ for q in Abcdef Abc123 Abc-123 Abc/123 ; do 
    if echo "$q" | grep -qP '^[[:alnum:]]' 
    then echo "$q: match" 
    else echo "$q: no match" 
    fi 
done 
Abcdef: match 
Abc123: match 
Abc-123: match 
Abc/123: match 

grep -P使用PCRE了。)

要查找的字符不是一個alnum的性格,你會使用

[^[:alnum:]] 

正如在這裏看到:

$ for q in Abcdef Abc123 Abc-123 Abc/123 ; do 
    if echo "$q" | grep -qP '[^[:alnum:]]' 
    then echo "$q: match" 
    else echo "$q: no match" 
    fi 
done 
Abcdef: no match 
Abc123: no match 
Abc-123: match 
Abc/123: match 

要查找既不是alnum字符也不是「 - 」的字符,你會使用

[^[:alnum:]-] 

正如在這裏看到:

$ for q in Abcdef Abc123 Abc-123 Abc/123 ; do 
    if echo "$q" | grep -qP '[^[:alnum:]-]' 
    then echo "$q: match" 
    else echo "$q: no match" 
    fi 
done 
Abcdef: no match 
Abc123: no match 
Abc-123: no match 
Abc/123: match 

順便說一句,REFind將工作就像以及REFindNoCase因爲alnum包括大寫和小寫字母,那麼不妨使用REFind

+0

謝謝你的建議。我經過多次試驗和錯誤之後才解決它:'REFind('[^ [:alnum:] - ]',ARGUMENTS.Username)''。我不知道它爲什麼會起作用,但唯一的區別是否定符號「^」在第一個方括號內 –

+0

這與您所問的內容相反。那看起來該字符串是否包含既不是「alnum」也不是「 - 」的字符。 – ikegami

+0

你是什麼意思?我希望它匹配一個字符串不包含字母數字字符或連字符的位置。然後,這反過來標誌我的用戶名包含特殊字符,如'<>%$£'等 –

0

更新:我看了一下這個問題RegEx: \w - "_" + "-" in UTF-8

最終的解決方案經過反覆試驗(否定必須是開括號內):

REFind('[^[:alnum:]-]', ARGUMENTS.Username)

相關問題