2016-08-24 97 views
0

免责声明 - 绝对新的正则表达式....正则表达式来找到特定字符串在javascript

我有一个这样的字符串:

subject=something||x-access-token=something 

为此,我需要提取两个值。 Subjectx-access-token

作为一个起点,我想收集两个字符串:subject=x-access-token=。对于这种这里是我做过什么:

/[a-z,-]+=/g.exec(mystring) 

它返回只有一个元素subject=。我期待他们两个。我在哪里做错了?

+2

可能会更容易分裂的双管,然后拆分等号每个 – scrappedcola

+0

想做正则表达式的方式...学习它们:) – beNerd

+0

@scrappedcola是正确的。应该优化使用正确的工具。我会使用正则表达式来进行实际的模式匹配。 http://regex101.com/ –

回答

2

g修改不影响exec,因为exec只有规范返回的第一个匹配。你想要的是match方法:

mystring.match(/[a-z,-]+=/g) 
+0

这确实回答我的问题。但是想要更开明。我如何开始使用正则表达式搜索特定的部分。例如在这里,我正在接近它,首先找到字符串'subject =',然后阅读所有内容,直到我找到一个||。 – beNerd

+0

您可以添加'(。*?)(?= \ | \ || $)'到最后,第一个捕获组将获得您的数据。 – RamenChef

0

如果你真的想用纯正则表达式来做到这一点:

var input = 'subject=something1||x-access-token=something2' 
 
var m = /subject=(.*)\|\|x-access-token=(.*)/.exec(input) 
 
var subject = m[1] 
 
var xAccessToken = m[2] 
 
console.log(subject); 
 
console.log(xAccessToken);

但是,它很可能是吸尘器把它分解相反:

console.log('subject=something||x-access-token=something' 
 
     .split(/\|\|/) 
 
     .map(function(a) { 
 
     a = a.split(/=/); 
 
     return { key: a[0], val: a[1] } 
 
     }));

0

不需要正则表达式。写一个小解析器,很简单。当有涉及的逃逸模式,它可以让你有||的值,或当值可以包含一个=在我的出现

function parseValues(str) { 
    var result = {}; 

    str.split("||").forEach(function (item) { 
     var parts = item.split("="); 
     result[ parts[0] /* key */ ] = parts[1]; /* value */ 
    }); 

    return result; 
} 

使用

var obj = parseValues("subject=something||x-access-token=something-else"); 
// -> {subject: "something", x-access-token: "something-else"} 

var subj = obj.subject; 
// -> "something" 

var token = obj["x-access-token"]; 
// -> "something-else" 

其他并发症。

你也可以用正则表达式来解决这些问题,但是使用基于解析器的方法,他们将更容易解决。

0

您必须执行exec两次以获取2个提取的字符串。

根据MDN:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec

如果你的正则表达式使用“G”标志,则可以使用exec()方法多次找到相同的字符串匹配连续。

通常,人们通过一个while循环提取与模式相匹配的所有字符串。请在浏览器控制台中执行以下代码以查看它的工作原理。

var regex = /[a-z,-]+=/g; 
var string = "subject=something||x-access-token=something"; 
while(matched = regex.exec(string)) console.log(matched); 
+0

而不是运行while循环,我只执行了两次exec,但得到了相同的结果。一个元素 - ['subject =']。在Chrome控制台中测试 – beNerd

0

您可以将字符串转换为有效的JSON字符串,然后解析它检索包含预期的数据的对象。

var str = 'subject=something||x-access-token=something'; 
 
var obj = JSON.parse('{"' + str.replace(/=/g, '":"').replace(/\|\|/g, '","') + '"}'); 
 
console.log(obj);

0

我不认为你需要的正则表达式在这里,只需使用JavaScript内置函数 “分裂”。

var s = "subject=something1||x-access-token=something2"; 
    var r = s.split('||'); // r now is an array: ["subject=something1", "x-access-token=something2"] 
    var i; 
    for(i=0; i<r.length; i++){ 
    // for each array's item, split again 
    r[i] = r[i].split('='); 
    } 

在最后你有一个像矩阵如下:

y  x 0    1 
    0  subject   something1 
    1  x-access-token something2 

,并且可以使用X和Y访问的元素:

"subject" == r[0][0] 
"x-access-token" == r[1][0] 
"something2" == r[1][1] 
相关问题