2016-08-10 51 views
3

我有一個電子郵件正文。它包含幾行文字。我需要提取一個字符串的第一個出現的是:正則表達式來匹配包含至少3個破折號/連字符的字符串

  1. 來自特定文本
  2. 後至少包含3個短線

虛線串的形狀是未知的。它可以包含任意數量的,即: AA3A-123-NNN-d或字母和數字12-000-12455-AS

例如:

Lorem存有悲坐阿梅德,consectetur adipiscing ELIT。 Donec imperdiet porta libero ac acddddiet。

南enim nisl:aliquam UT feugiat簡歷

具體的文字後,我需要搜索: Etiam rhoncus AAFA-12X-DDDD-12 metus risus 更多的文字:富

目標語言是C#。

我試過做類似([A-Za-z0-9]{5}-[A-Za-z0-9]{4}-[A-Za-z0-9]{3}-[A-Za-z0-9]{5})但正如你可以在這裏看到的,我需要設置字符串的形狀並不總是已知的。

+0

那麼如果他們在你的正則表達式中包含一個可能的字符範圍(在每個短劃線之前),你可以將{5}更改爲{1,5},以獲得1到5個 – Fivestar

回答

4

您可以使用一個懶惰的量詞與[\s\S]

(?:Specific\ text\ after\ which\ I\ need\ to\ search:) 
[\s\S]+?\K 
(\b\w+-\w+-\w+-\w+\b) 

\b是一個單詞邊界,\K刪除一切從左邊比賽。
參見a demo on regex101.com

+1

你也可以用'(?s)'代替'[\ s \ S]' – rock321987

+0

非常感謝,很好。如果字符串只有3個破折號,但是如果更多,例如:AA-B12-C333-D,它與第三個破折號後的部分不匹配 – Ashton

+1

@Ashton在最後加上'\ S *'如'\ b \ w + - \ w + - \ w + - \ w + \ b \ S *' – rock321987

0

如果您的表達式包含未知數量的字母和數字,則最好的做法是爲正則表達式指定一個範圍。我在你的例子中看到一個塊最多有5個字符,而最少有一個是1個字符。

因此,像這樣將捕獲它,

([A-Za-z0-9]{1,5}-[A-Za-z0-9]{1,5}-[A-Za-z0-9]{1,5}-[A-Za-z0-9]{1,5}) 
+0

,感謝Fivestar。 Jan的解決方案更接近我所需要的。我感謝您的幫助 ! :) – Ashton

+0

@Ashton沒有問題!這個答案好多了,我是一個相當懶惰的正則表達式,我剛編輯你的哈哈。祝你好運前進! – Fivestar

0

我會用類似(?:[a-zA-Z0-9]+-){3,}[a-zA-Z0-9]+的東西去。這將做什麼是匹配3個或更多的字母數字字母組合後跟一個沒有。

Try it yourself on Regex101

+0

謝謝Sebastian,我認爲這也是朝着正確的方向發展,但Jan和rock321987的建議更接近。感謝你的幫助! – Ashton

相關問題