2014-05-02 28 views
0

我已經在Mysql中使用正則表達式在一定程度上在MySql記錄(例如Init Cap,All Caps)中查找各種字符串模式。我試圖找到一個更復雜的模式,其中還包括可選字符串。我知道如果我只是搜索所有可能的模式,它會工作,但試圖查看正則表達式是否比這更強大,並會幫助我至少減少我需要搜索的模式。基本上這種模式是數字後綴。RegEx for#/使用MySql的文本模式

1)模式的開始總是一個#但是從1-5位數的任何地方。我寧願不必搜索[0-9],然後[0-9] [0-9]等。換句話說,搜索1到9999的任何數字字符串(無前導零)的某種方式

2)前導數字和後綴之間最多可以有三個單詞。再次,我寧願不必與1,2和3個單詞匹配模式。很顯然,如果我必須對每個版本的數字進行此操作,我已經有4 * 3個模式可供搜索,效率不高

3)有一個可選的修飾詞,可以是中間詞後,後綴。如上所述,我傾向於這樣表示,從本質上來說,我可以簡單地創建一個包含以下邏輯的正則表達式:

[最多4位數] [已知修飾詞列表中的可選修飾符] [一個到三個未知單詞] [已知後綴單詞列表的後綴] [已知變體單詞列表中的後綴]

RegEx是否甚至部分完成該任務,如果願意的話,任何幫助都可以啓動。

回答

2

由於MySQL使用Henry Spencer的正則表達式實現,常用簡寫像\s\w ......都可能是不可用的,而不是一個可以使用類似於POSIX字符類(MySQL regex manual)。

所需的圖案

[最多4Digits] [從修改詞語的已知列表可選修飾符] [一至中三未登錄詞] [後綴的後綴詞的已知列表] [可選修飾符從已知的修飾詞列表]

什麼是我不清楚的是:什麼是一個詞?除字母字符外,還可能包含哪些字符?考慮將[[:alpha:]]設爲字元字符[[:alnum:]]?還可以爲某些字符擴展一個posix類,這應該是單詞字符例如[[:alpha:]\'-]


同樣的東西可以成爲不同的排序規則等utf8_general_ciutf8_bin例如不同:

SELECT 'A' REGEXP '[a-z]' =>1

SELECT BINARY 'A' REGEXP '[a-z]' =>0


圖案

假設[[:alpha:]]作爲字字符[[:space:]]作爲隔板/邊界:

  • 1)[1-9][0-9]{0,3} ...應匹配,以4位數字:1〜9999
  • 2)([[:space:]](mod1a|mod1b|mod1c))? ...可選修改字...... *
  • 3)([[:space:]][[:alpha:]]+){1,3} ...之一三個未登錄詞
  • 4)([[:space:]](sfxa|sfxb|sfxc)) ...從已知列表後綴爲
  • 5)([[:space:]](mod2a|mod2b|mod2c))? ...可選修改字*

的問號後)使括號組可選。裏面還有另一個插入不同單詞的括號內的小組。有關更多詳細信息,請參見SO Regex FAQ

也有字邊界(零寬度)提供MySQL的正則表達式:[[:<:]]word[[:>:]]


把它全部togehter和^開始和$端錨之間,圖案看起來是這樣:

SELECT '9999 mod1a aa ab ac sfxa mod2a' 
REGEXP '^[1-9][0-9]{0,3}([[:space:]](mod1a|mod1b|mod1c))?([[:space:]][[:alpha:]]+){1,3}([[:space:]](sfxa|sfxb|sfxc))([[:space:]](mod2a|mod2b|mod2c))?$' 

測試並修改它以滿足您的需求。希望這有助於,快樂的regexing!

+1

對於關於shorthands的筆記+1,它已經有一段時間了,因爲我已經在MySQL。 – Sam

+0

在這兩種情況下的偉大建議謝謝。回答你的「什麼是一個詞?」它實際上是兩個或更多字母(不是#)的任意組合,情況不是問題。重要的標識符是起始數字和後綴,它們可以只是10-20個字符串中的一個(並且可選的後綴修飾符可以是10中的一個)。 Anytihng可以介於真實而實際的情況下,這將是最多三個字。因此Digit(KnownModifer)1-3Words後綴(KnownModifier)。我願意失去(罕見的)4 Words,因爲這將開始讓我的字符串匹配不是實際的模式匹配。 –

+0

不會被擊斃,但更準確地說,這是:[1-4NumberDigit] [可選:10個已知Modifer詞中的任意1個] [任意2個字母或更多不區分大小寫的AlphaWord] [可選任意2個字母或更多不區分大小寫的AlphaWord ] [可選:2個字母或更多不區分大小寫的任意AlphaWord] [10個已知後綴詞中的任意1個] [可選:10個已知修飾詞中的任意1個] –

1

像這樣的東西可以讓你開始:

[1-9]\d{0,4}\s+ # 1-9 (no leading 0), followed by up to 4 more digits and whitespace 
(\w+\s+)?   # Optional modifier (replace \w+ with modifiers) followed by whitespace 
(\w+\s+){1,3}  # 1-3 occurrences unknown words (you may want to elaborate on \w+) followed by whitespace 
\w+    # Required suffix (replace \w+ with suffixes) 
(\s+\w+)?   # Optional modifier (replace \w+ with modifiers) preceeded by whitespace 

看到這個full example你會如何實現你的改性劑/後綴的列表。在這個例子中,我們的修飾符是['optional', 'etc'],我們的後綴是['suffix', 'end']

這應該讓你在正確的方向,如果你需要更多的指導,讓我知道在評論中。

+0

謝謝我嘗試從Johhny5上面修改,然後使用您的regex.com鏈接進行測試。有趣的是,模式匹配在regex.com上完美工作,但在mysql中失敗(返回0)。 –