2017-10-12 43 views
0

比方說,我有兩個字符類[1234](稱之爲「純數字」)和[⓵⓶⓷⓸](稱之爲「時髦數字」)。我可以創建一個混合字符類,如[1234⓵⓶⓷⓸]+(稱之爲「類數字」),匹配一個或多個純粹或時髦的數字。正則表達式匹配類似數字的字符串,但不是純數字字符串

但我想只能匹配數字字符串與至少一個時髦的數字。也就是說,匹配字符串如⓵2⓷4123⓸⓵⓶⓷⓸,但而不是匹配像1234這樣的純數字字符串。

你能想出一種方法來表達它作爲正則表達式嗎?

+0

你不能使用'\ d * \ D + \ d *'? –

+1

開始您的模式與積極lookahead'^(?=。* [⓵⓶⓷⓸])[1234⓵⓶⓷⓸] +' – CAustin

+0

什麼是編程語言/正則表達式庫?你是從大文本中提取子串嗎?更換? –

回答

2

隨着PCRE(或支持佔有慾量詞任何正則表達式引擎),你可以這樣做:

/[1234]*+[1234⓵⓶⓷⓸]+/u 

的佔有慾量詞*+禁止回溯,在這種情況下,你肯定至少還有一個特殊的數字(因爲下一個數字只能是不在第一個字符類中的特殊數字之一)。

請注意,要處理這種多字節字符,您必須使用u修飾符。

+2

這將匹配'1234' – Barmar

+0

@Barmar [它不會匹配'1234'](https://regex101.com/r/9b9RcJ/1)。 –

+0

是因爲'* +'嗎? – Barmar

2

由於我們不知道序列中的哪個位置會出現奇怪的數字,我們需要用任意大小的數字式表達式開始和結束表達式,[1234⓵⓶⓷⓸]*

由於需要至少一個時髦數字,我們還需要匹配至少一個需要時髦的符號,[⓵⓶⓷⓸]

因此,我們得到的表達式是[1234⓵⓶⓷⓸]*[⓵⓶⓷⓸][1234⓵⓶⓷⓸]*

+0

這也適用,而且很簡單。我更喜歡佔有式量詞解決方案,因爲它可以防止回溯。對於較長的純字符串,由regex101氣球報告的「步數」與「* +」解決方案相比較(例如:https://regex101.com/r/KyuX8u/3)。感謝您的回答。 – David

相關問題