2015-04-06 54 views
0

我有一串字母:正則表達式:尋找不重複的字符

'AAACDDBBK' 

我想只匹配字符,只重複一次,所以例如:CK。我知道括號{}可以用來指定你想要的比賽數量,但這似乎並不適合我。

str = 'AAACDDBBK' 
regex = /[a-zA-Z]{1}/ 
str.match(regex) 
>>>["A"] 

如何過濾出現一次以上的字符?

+0

你使用什麼語言? –

+0

使用javascript –

回答

4

您可以使用這樣的正則表達式查找重複:

(.).*\1 

然後你可以使用一個空字符串替換在你的主串,所以你得到的字符串將非重複

的所有字符

Working demo

substitution section含有非重複的字符您得到的字符串:

enter image description here

順便說一句,如果你只是想找個非重複的字母,你可以改變正則表達式:

([A-Za-z]).*\1 

這個解決方案,適用於連續的字符,但如果你能有重複字符,那麼你應該使用其他解決方案我要做的是將字符串拆分爲字符並將它們添加到地圖中,然後爲每個字符存儲它們的出現次數。那麼,你有沒有正則表達式的另一種方法。

+0

這不起作用.e.g'「AAPAACDDBBK」.replace(/([A-Za-z])。* \ 1/g,「」);' – anubhava

+0

是的,當我嘗試這個時,我得到了「[」AAA「,」A「]」 –

+0

好點。讓我修復 –

0

使用Ruby或PHP,你可以使用這種模式:

(?:(.)\1+)*\K(.|$) 

的想法是找到一個獨特的性格,最終由一個或幾個重複的字符序列之前,然後使用\K從整體上刪除匹配結果並使用簡單的.或字符串結尾匹配搜索到的唯一字符。

demo

的其他可能的方式包括使用與重複的字符開始的交替:

(?:(.)\1+)+|(.) 

不再重複字符是捕獲組2

+0

我正在努力解決這個問題,也試過你正則表達式不起作用[https://regex101.com/r/vL0kP4/1] –

+0

@Fede:看起來你沒有'不要看我的方法是否匹配(見捕獲組2的結果)而不是取代任何東西。 –

+0

@Fede:在我看來,OP只希望避免連續的字符,並且要清楚,如果不是這種情況(因此,不管字符串中的位置是否是非重複字符),它不再是一個正則表達式的工作。 –

0

在這是一種解決方法在JavaScript中沒有先進的PCRE功能:

str = 'AAACDDBBK' 
str.replace(new RegExp(str.match(/([A-Z])(?=.*?\1)/ig).join('|'), "g"), ""); 
//=> CK 

str="AAPAACDDBBK"; 
str.replace(new RegExp(str.match(/([A-Z])(?=.*?\1)/ig).join('|'), "g"), ""); 
//=> PCK 
0

Federico Piazza上面的解決方案。 在Ruby中,它看起來像這樣:

st = 'aaabbceeefgh' 

# All non-repeated characters: 
st.gsub(/(.).*\1/,'') # => "cfgh" 

# First non-repeated characters: 
st.gsub(/(.).*\1/,'')[0] # => "c"