2015-12-29 63 views
1

我不得不寫一個正則表達式來匹配字符串。我將使用.net C#。一個複雜的正則表達式

  1. 字符1必須是字母[A-Z,a-z]。

  2. 字符2必須是連字符。

  3. 字符3到6必須是數字[0-9],字母[A-Z,a-z]或插入符號[^]。

  4. 如果任何字符3到6都有[^],所有後續字符必須等於[^]。

我最後寫下面的表達式:

[a-zA-Z][-]([0-9a-zA-Z\^]{4}) 

但我不知道如何照顧4標準。

我是新寫的正則表達式,所以無論我寫的是通過教程。如果有人能夠幫助我完成正則表達式和共享鏈接或打破正則表達式並解釋它,這樣我就可以學習和編寫更復雜的正則表達式,這將是非常有幫助的。

+0

正則表達式匹配可以發生在字符串中的任何位置,[除非指定錨點](https://msdn.microsoft.com/en-us/library/az24scfc%28v=vs.110%29.aspx# atomic_zerowidth_assertions) - 在你的情況下,因爲你想匹配字符1,所以你應該在你的正則表達式開頭使用'\ A'來聲明位於字符串開頭的位置。如果我理解正確,它應該是正好6個字符的長度,所以你會希望在你的正則表達式的末尾使用'\ z'。另外,.NET有一個不區分大小寫的選項,它可以將您的(拉丁)字母字符檢查簡化爲[A-Z]。 –

回答

3

[我沒有以任何方式與他們關聯]你去:

^[a-zA-Z]-([0-9a-zA-Z]|\^(?=($|\^))){4}$ 

我修改你的正則表達式了一下,最後添加條件。

  • 添加^$在開始和結束時,他們在哪裏整個字符串只有
  • 刪除[]匹配沒有必要圍繞-
  • 去除周圍的最後一組() - 沒有必要

最後一個條件是通過將最後一組更改爲[0-9a-zA-Z](這很簡單)或\^(?=($|\^))來完成。這是插入符號的特殊處理:

  • 插入符號後面必須跟着字尾或其他插入符(?=($|\^))。這使用前瞻性肯定斷言來確保第一個插入符號和結束符之間只有插入符號。
+0

這工作!謝謝Szymon。所以基本上[0-9a-zA-Z] | \^ 表示允許的字符是數字,字母或插入符號。 然後(?=($ | \ ^)) 告訴下一個字符應該是行尾或插入符。 我的理解是否正確? – thinkmmk

+0

@thinkmmk幾乎,順序是不同的。它是[0-9a-zA-Z]或\ ^(?=($ | \ ^)),這意味着它是字母數字或插入符號,然後是另一個插入符號或行尾。 – Szymon

-1

轉到RegEx101:https://regex101.com/r/lC1pD7/1

我插入您的正則表達式部分存在。 它有一個快速參考,將使它成爲一個快速完成,測試和理解。

我覺得它可以寫成簡單,但這裏