javascript regex - 返回值,除非后面跟着或前面跟着

时间:2016-09-14 18:28:21

标签: javascript regex

我有一些不同的字符串组合,我试图以这种格式返回结果:

[0-9]{1,3}GB除非字符串中某处有SD,否则字符串中的RAM后面跟着。{/ p>

因此:

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的正则表达式。

任何想法从哪里开始?

2 个答案:

答案 0 :(得分:1)

我不认为你可以用一个正则表达式做到这一点,但这是一个功能:



d2={'ab': ['2'], 'hij': ['600']}




如果你想变得可爱,可以将功能压缩到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');

答案 1 :(得分: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"]

RegEx分手:

  • SD.*\d{1,3}\s*GB - 匹配SD后跟1-3位数字和GB
  • | - 或
  • (\d{1,3}\s*GB) - 匹配1-3位数字和GB以及将其分组到捕获的组#1中
  • (?!.*\bRAM) - 如果我们在当前位置后RAM
  • ,则表示否定匹配失败

所以我们在交替中匹配并忽略第一部分并且仅保留第二部分在一组中。我们只在结果中存储捕获的组。