2014-04-23 101 views
0

有問題的線是這個:Javascript Regex這行是做什麼用的?

var extendedXmp = (data.match(/xmpNote:HasExtendedXMP="(.+?)"/i) || [])[1];

正是在這裏更大的代碼塊的一部分:

this.parseCompoundImage = function(data) { 
var extendedXmp = (data.match(/xmpNote:HasExtendedXMP="(.+?)"/i) || [])[1]; 
if (extendedXmp) { 
    // we need to clear out JPEG's block headers. Let's be juvenile and don't care about checking this for now, shall we? 
    // 2b + 2b + http://ns.adobe.com/xmp/extension/ + 1b + extendedXmp + 4b + 4b 
    data = data.replace(new RegExp('[\\s\\S]{4}http:\\/\\/ns\\.adobe\\.com\\/xmp\\/extension\\/[\\s\\S]' + extendedXmp + '[\\s\\S]{8}', 'g'), '') 
} 

var xmp = data.match(/<x:xmpmeta [\s\S]+?<\/x:xmpmeta>/g), 
    result = {} 
if (!xmp) throw "No XMP metadata found!"; 
xmp = xmp.join("\n", xmp); 

它來自the source code of the depthy app。這段代碼獲取XMP元數據,並使用正則表達式清除JPEG exif頭。這段代碼的第二行是讓我困惑的。根據我的理解,它會嘗試匹配數據中的某種模式,但我對JavaScript不太瞭解,無法理解它。有人能向我解釋那條線是幹什麼的嗎?

感謝

+1

什麼讓你困惑?正則表達式模式本身或調用'match'或'|| []',還是最後的'[1]'?實際上這方面有很多事情要做,也許你只需要分解它,並嘗試單獨瞭解每一點。 –

+0

讓我困惑的是,從我理解的匹配應該返回一個字符串,但它然後與'[]'進行比較,它試圖實現什麼?最後,'[1]'意味着讓第二個字符正確? – Shef

+0

謝謝。我現在明白了:該文件有一行說: 'xmpNote:HasExtendedXMP =「FF72 ...」/>'此代碼匹配FF72 ...'。如果註釋不存在,則用空數組替換它。你想寫它作爲答案,所以我可以接受它嗎? – Shef

回答

2

[1]引用的第一個也是唯一捕獲組,(.+?).match()方法返回由完全匹配(第0個元素)組成的數組,並且任何捕獲組都將填充數組中的其他值。它只有在g標誌爲而不是組時才起作用。當找不到匹配時,將extendedXmp設置爲空數組。這是JavaScript的一個有點整齊的功能,如果評估結果爲「虛假」的值,則可以設置變量,儘管爲了使我在寫的內容更加明顯和清晰,我傾向於避免它。這就是說,代碼做這個判斷並沒有真正的理由。人們可以簡單而簡潔地避免整個|| []考驗,而是用if (extendedXmp !== null)進行測試,而且對於其他開發人員(比如你或我),它會更「乾淨」,更清晰,更易於閱讀。

+0

爲了得到'String.prototype.match()返回引用的對象的'1'屬性的值,您建議的比較將需要另一個賦值操作 - 並且爲了清楚起見,另一個變量 - '。實際上,'null'和'undefined'都被轉換爲'false',所以不需要額外的操作。 – PointedEars

+0

原始代碼可能是'。*?',在這種情況下屬性值可以是零長度的字符串,也可以將其轉換爲'false';意圖可能是將這種情況視爲屬性不存在。 (當然,這種方法也可能基於對'。+?'的錯誤理解,這似乎是有人試圖用正則表達式解析XML的情況 - 這不是一個好主意。) – PointedEars