2013-08-27 99 views
2

我正忙於正規表達整天,並找不到解決方案。 我試圖在包含數字,分號,冒號和空格的字符串中找到一些具體的數字。正則表達式 - 在字符串中找到具體數字

爲了我們的目的,讓我們說,我找數

這裏有應符合幾個例子(每一行是一個不同的字符串):

1234 
;1234; 
1234 : 5678 
;1234,3321 

而且例子不應該匹配(因爲它是不同的數字):

;12345; 

我目前的a ttempt:

[^(0-9*)]1234[^(0-9*)] 

這裏是一個永久鏈接的正則表達式測試儀與我的問題: Regex Tester fiddle

+1

您最終會使用哪種語言或工具?另外,這不是字符類的字怎麼樣,你是在尋找負面的[lookarounds](http://www.regular-expressions.info/lookaround。html] –

+0

'[^(0-9 *)]'表示不是數字('0-9'),括號('('或')')或星號*。你可能只想使用'[^ ​​0-9]'(不是數字)。 – Dukeling

+0

我打算在使用REGEX的MySQL中使用它,其中 –

回答

2

也許試試這個:([^0-9]|^)1234([^0-9]|$)在這種情況下,你不需要lookaround功能。

你可以用它來更好地理解regexp。它有一個很好的GUI可視化的模式。 Debuggex

+0

請注意,這將無法匹配字符串開頭或結尾的數字。 –

+0

'1234'將作爲重複計數集 – Jay

+0

@Jay不會不會 –

2

如果你的味道支持lookahead and lookbehind,去這樣的:

(?<!\d)1234(?!\d) 

環視試驗字符的出現次數不匹配它們。只有在沒有發生的情況下才會接受負面查看。

如果它支持word boundaries

\b1234\b 

字邊界包括如。空白和標點符號。

否則檢查非數字字符和字符串添加起點和終點:

(^|\D)1234($|\D) 

如果你的引擎甚至不支持\d\D,通過[0-9]各自[^0-9]替換它們。

+1

字符類中的'^'和'$'只是文字字符。你需要在外面使用錨點,例如'(?:^ | \ D)...(?:\ D | $)' –

+0

Aye,太快了 - 編輯我的文章,但省略了非匹配組,因爲這不是必需的,但會使查詢更加複雜。 –

+0

當然,沒關係。我只是覺得,即使這種模式混亂了,它也是最重要的正則表達式習慣之一。因爲有人*知道正常括號可以捕捉到我們所捕捉的東西 - 所以我總是試圖保持清晰,並避免同時產生不必要的開銷。 –

0

這可能會實現:

.*[^0-9]*[1][2][3][4][^0-9]*.* 

工作原理:

.*    anything 
[^0-9]*  an optional character that is not a number 
[1][2][3][4] "1234" done this way because it will be taken as a repeat count unless escaped 
[^0-9]*  an optional character that is not a number 
.*    anything 

有可能是與啓動或「1234」結尾,並沒有其他字符的字符串的問題。取決於正則表達式的實現,可能不需要匹配正面和背面上的任何內容。

+0

由於'[^ 0-9]'是可選的,'。*'可以匹配除'1234'(包括相鄰數字)之外的所有內容。也不需要把這些數字放在課堂上。 –

+0

他們將被視爲重複計數,除非被轉義 – Jay

+0

不,他們不會。那是'{1234}' –

相關問題