2016-03-08 39 views
-4

組值(a|b|c)什麼是正則表達式會給我這些輸出這些語句:如何檢查組中具有不同值的語句?

a (True) 
a,b (True) 
b,c (True) 
b,c,a (True) 

a, (false) -no value after ',' 
a,a (false) -Repeated values 
b,b (false) -Repeated values 
+1

您的問題不清楚,請澄清一下。 – Maroun

+0

@WiktorStribiżew這將匹配a,a和b.b,不是嗎? –

+0

@ChrisLear:當然,前瞻是必要的。 –

回答

2

這裏是一個正則表達式,用於防止重複項尾隨逗號。

/^(?:([abc]),(?!.*\1))*([abc])$/gm 

它測試包含字符後跟一個逗號一個可選基。在組內 - 使用負向預測來確保相同的字符不會在線上自行重複。這個組可能重複任何次數。最後測試最終字符(不可選)。

Example regex101 here

問候

編輯:

在回答在評論一個問題 - 這裏是你如何可以做同樣的代幣/詞:

^(?:(cat|dog|rat),(?!.*\1))*(cat|dog|rat)$ 

regex101 example

它基本上是相同的正則表達式,但使用替代字符類的替代字。

+0

'/ ^(?:(:?,?([abc]))(?!。* \ 1))* $/gm'稍微短一點,我認爲其他類似。 –

+0

@ChrisLear一個逗號,但我猜不是這樣 – ClasG

+0

我真的很喜歡改變它搜索的字母的容易程度 – 4castle

0

你想找到在中集集團昏迷sperated列表{A,B,C},但你不需要任何額外的尾隨昏迷。我想你也不想缺少元素(連續的昏迷)。

我提出這樣的:

^([a|b|c],)*[a|b|b]$ 

,並提出一點解釋:

  • ,第一部分([A-Za-z]+,)*搜索每個字母元素跟一個逗號。。可以有任何數量的這些元素。這些是n個元素列表中的1,2,... n-1個元素。

  • 然後這最後部分[a|b|c]尋找最後元素。

  • 整個字符串被^[stuff]$包圍,從而強制正則表達式匹配整個輸入字符串,從開始到結束。

試試吧here。 (我不隸屬於這個網站)

希望這對我有所幫助。

+0

只是播種,你不想重複。運氣不好,我不認爲這是可能的。我建議使用上面的方法,然後掃描一次'。* a。*'然後掃描'。* b。*',最後掃描'。* c。*'並請求最後3次掃描的匹配次數爲< 1 –

+0

這匹配重複。不正確 – 4castle

+0

,但這會給我一個重複的阿爾法這樣的,a或b,b :( –

-1

正則表達式不是解決此問題的唯一方法。

如果您想了解如何在沒有正則表達式的情況下執行此操作,以下是一段JavaScript代碼,演示瞭如何執行此操作。如果你想看到它與ClasG的正則表達式的完整演示,here's a cool little fiddle I made

var regexReplacement = function(input) { 
    var acceptableStrings = ["a", "b", "c"]; 
    var arr = input.split(","); 
    if (arr.indexOf("") == -1 && (new Set(arr)).size == arr.length) { 
    return arr.every(function(val) { 
     return acceptableStrings.some(function(acceptable) { 
     return val === acceptable; 
     }); 
    }); 
    } else { 
    return false; 
    } 
} 
+0

如果你是好奇的是,我發現我的函數平均在* 0.2141 * ms左右,而正則表達式平均在* 0.2134 ms *左右。 – 4castle

+0

我真的不希望這比使用正則表達式更好或更差,我只是爲了徹底而給出一個替代方案。 – 4castle

+0

非常感謝我的朋友 –

相關問題