2016-09-14 2 views
1

ich ein paar verschiedene String-Kombinationen haben und ich versuche Ergebnisse in diesem Format zurück:javascript regex - Rückgabewert, es sei denn, gefolgt von oder voran mit

[0-9]{1,3}GB wenn sie nicht von SD irgendwo in der Zeichenfolge vorangestellt ist, oder gefolgt von RAM irgendwo in der Zeichenfolge.

So:

8 GB zurückkehren sollte: 8 GB

8 GB RAM zurückkehren sollte:

SD Card 8 GB zurückkehren sollte:

microSD, up to 32 GB zurückkehren sollte:

16 GB sollte zurückgeben: 16 GB

Diese (([0-9]{1,3}GB)(?!\s+RAM)(?!SD)) funktioniert nicht mit Javascript-basierten Regex.

Irgendwelche Ideen, wo ich anfangen soll?

+0

Ich bin nicht sicher, Regex ist in der Lage, negative Übereinstimmungen für Strings beliebiger Länge zu tun. IMO sollten Sie eine erste Runde machen, in der Sie alle Zeichenfolgen auslesen, die mit 'SD. * \ D {1,3}? GB' und' \ d {1,3}? GB. * RAM' übereinstimmen, und dann '(\ d {1,3}? GB) 'in der resultierenden String-Liste. – Siguza

+0

Erwarten Sie, dass eine Eingabezeichenfolge eine einzelne oder mehrere Übereinstimmungen enthält? Siehe https://regex101.com/r/qO8xN1/2 –

+0

Keine dieser Zeichenfolgen entspricht '[0-9] {1,3} GB'. – melpomene

Antwort

1

ist, was Sie mit einem einzigen Regex tun können abwechselnd mit für Gegenwart einer Erfassungsgruppe zu überprüfen:

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"]

RegEx Breakup:

  • SD.*\d{1,3}\s*GB - Match SD gefolgt von 1-3 Ziffern und GB
  • | - OR
  • (\d{1,3}\s*GB) - Match 1-3 Ziffern und GB und Gruppe in erfassten Gruppe # 1
  • (?!.*\bRAM) - Negativer Look-Ahead, das Spiel scheitern, wenn wir RAM nach aktueller Position
  • haben

Also wir passen und ignorieren den ersten Teil im Wechsel und behalten nur den zweiten, der in einer Gruppe ist. Wir speichern nur gefangene Gruppen in unserem Ergebnis.

1

Ich glaube nicht, dass Sie dies mit einem einzigen Regex tun können, aber hier ist eine Funktion:

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');

Wenn Sie nett sein wollen, können Sie die Funktion str => (/\d{1,3} *GB(?![\s\S]*RAM)/.exec(str.replace(/SD[\s\S]*$/, '')) || [null])[0] komprimieren . Hier

Verwandte Themen