2012-09-10 65 views

回答

8

我會避免正則表達式可預見的字符串,並建議:

var colorString = "rgba(111,222,333,0.5)", 
    colorsOnly = colorString.substring(colorString.indexOf('(') + 1, colorString.lastIndexOf(')')).split(/,\s*/), 
    red = colorsOnly[0], 
    green = colorsOnly[1], 
    blue = colorsOnly[2], 
    opacity = colorsOnly[3]; 

JS Fiddle demo

或者,因爲你希望它返回一個對象:

var colorString = "rgba(111,222,333,0.5)", 
    colorsOnly = colorString.substring(colorString.indexOf('(') + 1, colorString.lastIndexOf(')')).split(/,\s*/), 
    components = {}; 
components.red = colorsOnly[0]; 
components.green = colorsOnly[1]; 
components.blue = colorsOnly[2]; 
components.opacity = colorsOnly[3]; 

console.log(colorsOnly, components);​ 

JS Fiddle demo

+0

出於好奇,我對你爲什麼這麼建議的原因感興趣 - 是否正則表達式的資源密集程度更高,還是比較慢? – Dan

+0

正則表達式在處理和匹配各種表達式方面可能相當昂貴。它並不總是比較慢,它只是簡單的字符串或數組函數往往會更便宜一些。我沒有進行任何比較來確定這個問題的更快解決方案,但是我更喜歡在可能的情況下避免使用正則表達式,如果可以使用更簡單的方法。所以...個人偏見,和(通常)昂貴的正則表達式引導我推薦這種替代方案。 –

+0

所以我在這個應用程序中對此感到好奇,所以我在我正在使用的正則表達式解決方案,鏈接分割命令和這裏提到的解決方案之間進行了比較。 100,000個元素的結果爲:正則表達式:76ms分割:121ms子字符串:96ms - 結果在多次運行中保持相似。所以在這種情況下,正則表達式更快,但不是太多。 – sirclesam

3

的正則表達式,這將是:

^rgba\(([^,]+),([^,]+),([^,]+),([^,]+)\)$ 

Javascript代碼:

var regex = /^rgba\(([^,]+),([^,]+),([^,]+),([^,]+)\)$/g; 
var input = "rgba(111,222,333,0.5)"; 
if(regex.test(input)) { 
    var matches = input.match(regex); 
    for(var match in matches) { 
    alert(matches[match]); 
    } 
} else { 
    alert("No matches found!"); 
} 

您可能要修剪的比賽和/或值轉換爲數字,以獲得所需的RGBA值JavaScript的。

RegexHero

玩這個如果正則表達式本身參數之間你想把手的空間,它可能會開始面色難看是這樣的:

^rgba\(\s*([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)\s*\)$ 
0

,如果它總是在RGBA格式,你可以做一些事情像這樣:

var str = 'rgba(111,222,333,0.5)' 

var red = str.substr(5,3); 
var green = str.substr(9,3); 
var red = str.substr(13,3); 
+0

這是真實的,但它是完全合法的'RGB()'或'RGBA()',串有'RGBA(2,3,4)',所以'子()'方法不一定是最好的選擇(除非你能夠用前置零執行數字)。 –

+1

@DavidThomas你是對的,我只是提供了正則表達式的替代方案。 也許與一個分裂井... – Jarry

+0

這個答案只是不夠靈活。 – Shmiddty

3

使大衛更簡單和expainatory

var colorString = "rgba(111,222,333,0.5)"; 
var colorsOnly = colorString.split(")"); //gives "rgba(111,222,333,0.5" at index 0 
var colorsOnly = colorString[0].split("("); //gives "111,222,333,0.5 at index 1 
var colorsOnly = colorString[1].split(","); 

給出 「111」[0]時, 「222」,在[1], 「333」,在[2]和 「0.5」,在[3] 但注意:所有這些都具有字符串數據類型,因爲所有這些都是子字符串。

red = parseInt(colorsOnly[0]); 
green = parseInt(colorsOnly[1]); 
blue = parseInt(colorsOnly[2]); 
opacity = parseFloat(colorsOnly[3]); 

使用parseInt()parseFloat()方法的字符串轉換成整數和浮點RESP。

+0

這不起作用。頂部代碼塊的第3行和第4行應該是var colorsOnly = colorsOnly [0] .split(「(」);然後var colorsOnly = colorsOnly [1] .split(「,」); – Dss

0

對於艾哈邁德比拉爾的回答,我有些事要糾正。如果我錯了,請隨時糾正我! :)

它應該是:

var colorsOnly = colorString.split(")"); 
    var colorsOnly = colorString.split("("); 
    var colorsOnly = colorsOnly[1].split(",");  

通知第四句的變化。由於ColosOnly從第三句已經代表了「(」分裂後的結果,所以我認爲它應該在第三句中是colorsOnly[1],我自己試了一下並得到證實。

再次,如果我錯了,請也隨時糾正我!:)

+0

這不起作用,但你「重新在正確的軌道上,因爲它是由第2覆蓋,不保存任何的第一行不會做任何事情 這是很難讀,但你可以事事連鎖在一起:。 VAR colorsOnly = colorString.split(‘)’ )[0] .split( 「(」)[1] .split( 「」); – sirclesam

相關問題