2016-09-14 10 views
1

我有幾個不同的字符串組合,我試圖以這種格式返回結果:JavaScript的正則表達式 - 返回值,除非後面或前面有

[0-9]{1,3}GB,除非它是由SD在串的地方之前,或之後通過RAM字符串中的某處。

因此:

8 GB應返回:8 GB

8 GB RAM應返回:

SD Card 8 GB應返回:

microSD, up to 32 GB應返回:

16 GB應該返回:16 GB

(([0-9]{1,3}GB)(?!\s+RAM)(?!SD))不適用於基於JavaScript的正則表達式。

任何想法從哪裏開始?

+0

我不確定正則表達式能夠對任意長度的字符串進行否定匹配。國際海事組織你應該做第一輪過濾所有符合'SD。* \ d {1,3}?GB'和'\ d {1,3}?GB。* RAM'的字符串,然後運行'(\ d {1,3}?GB)'在結果的字符串列表上。 – Siguza

+0

您是否期望輸入字符串包含單個或多個匹配?請參閱https://regex101.com/r/qO8xN1/2 –

+0

這些字符串均不匹配[[0-9] {1,3} GB')。 – melpomene

回答

1

這裏是你可以使用交替檢查捕獲組的存在與一個正則表達式做什麼:

var arr = ['8 GB', '8 GB RAM', 'SD Card 8 GB', 'microSD, up to 32 GB', '16 GB']; 
 
var re = /SD.*\d{1,3}\s*GB|(\d{1,3}\s*GB)(?!.*\bRAM)/i; 
 

 
var res = []; 
 
for (i=0; i<arr.length; i++) { 
 
    var m = arr[i].match(re); 
 
    res.push(m && m[1] || ''); 
 
} 
 

 
console.log(res); 
 
//=> ["8 GB", "", "", "", "16 GB"]

正則表達式破碎:

  • SD.*\d{1,3}\s*GB - 匹配SD後跟1-3位數字和GB
  • | - OR
  • (\d{1,3}\s*GB) - 第1-3位和GB組它捕獲組#1
  • (?!.*\bRAM) - 如果我們有RAM負向前查找失敗當前位置賽後

因此,我們正在匹配並忽略第一部分的交替,只保留第2組。我們只在我們的結果中存儲捕獲的組。

1

我不認爲你可以用一個正則表達式做到這一點,但這裏有一個功能:

function extract_match(str) { 
 
    // there can be no matches past "SD" 
 
    str = str.replace(/SD[\s\S]*$/, ''); 
 

 
    var m = /\d{1,3} *GB(?![\s\S]*RAM)/.exec(str); 
 
    return m && m[0]; 
 
} 
 

 
function test(str) { 
 
    console.log('input: "' + str + '"; result: ' + extract_match(str)); 
 
} 
 

 
test('8 GB'); 
 
test('8 GB RAM'); 
 
test('SD Card 8 GB'); 
 
test('microSD, up to 32 GB'); 
 
test('16 GB');

如果你想成爲可愛的,你可以將功能壓縮到str => (/\d{1,3} *GB(?![\s\S]*RAM)/.exec(str.replace(/SD[\s\S]*$/, '')) || [null])[0]

相關問題