2016-08-11 49 views
3

我想編寫一個正則表達式來查找單詞長度是3個字符,但是前面的m_是可選的。在這種情況下,需要至少3個字符的m_if else failing regex

基本上我想匹配

Abcm_abc和不匹配abm_ac

(^(m_))?([a-zA-Z0-9_]{3,})|(^[a-zA-Z0-9_]{3,}$) 

我試過了,如果循環,但它是匹配的文本m_a也。 可以請你幫我我在這裏失蹤

也許我寫了我的正則表達式錯誤。 我想是這樣 如果(M_找到) 「其次是需要3個字符」 其他 「你看,如果字符的總數是3」

感謝。

+0

事情出錯了,因爲你也可以選擇'^'。 – trincot

+0

你使用什麼語言或正則表達式解析器?您提供的示例似乎是ERE,但是如果您的解析器支持PCRE,則可以使用更多選項.... – ghoti

回答

2

您可以使用此正則表達式,或者要求m_在開始或禁止它(負前瞻):

^(m_|(?!m_))\w{3,}$ 

regex tester

如果負的樣子,頭不一個你可以使用的功能,那麼你可以去這個更復雜的正則表達式,它通過前兩個字符的不同選項:

^(m_\w{3,}|m[A-Za-z0-9]\w+|[A-Za-ln-z0-9]\w{2,})$ 

請參閱regex tester

+0

非常感謝它。但對不起,我有更多要問。我認爲如果我知道基本的話我可以擴展,但我無法擴展。是否可以添加g_也。它就像m_或g_被允許 –

+0

用'g_'擴展:'^(m_ | g_ |(!!m _)(?!g _))\ w {3,} $' – trincot

+0

傑出的謝謝。 –

0

你想讓你的3個字符的單詞能夠有下劃線嗎?因爲如果沒有,那麼你可以將[a-zA-Z0-9_]更改爲[a-zA-Z0-9],在這種情況下它不應該與m_a匹配。除非你想匹配數字,你可以進一步簡化爲[a-zA-z]

+0

感謝您的回覆。是的,我的要求是匹配_也。它用於檢測代碼是否按照標準寫入。像「Test_Val」這樣的變量是有效的 –

+0

啊,好的。那麼,爲什麼'm_a'不是一個有效的變量名? –

+0

如果先找到m_,那麼後面應該跟3個字符。如果沒有找到,那麼正如你所說的是,我們可以允許像a_b這樣的東西。 –

0

主要錯誤是^行錨點位於可選的括號表達式內部。你想無條件地開始行,然後是可選的m_?

您可以顯着簡化其餘部分。需要三個字符的表達式捕獲三個或更多;正則表達式將在這一點上成功,無論你是否處於輸入的結尾。

^(m_)?[a-zA-Z0-9_]{3} 

字符類中的下劃線看起來有些可疑。你真的打算用一個「單詞」來包含下劃線嗎?那麼m_ac也將匹配,因爲它至少有三個字符長,並且由集合中的字符組成,即使您說它被明確禁止。