Regex在javascript中查找特定字符串

regex to find specific strings in javascript

本文关键字:字符串 查找 javascript Regex      更新时间:2023-09-26

免责声明-对正则表达式绝对陌生....

我有一个像这样的字符串:

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

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

作为起点,我想收集两个字符串:subject=x-access-token=。下面是我所做的:

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

它只返回一个元素subject=。我以为他们俩都会来。我哪里做错了?

g修饰符不影响exec,因为exec只根据规格返回第一个匹配。您需要的是match方法:

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

不需要正则表达式。写一个小解析器,这很容易。

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"

当涉及的转义模式允许您在值中包含||,或者当值可以包含=时,会出现额外的复杂性。

使用regex方法也会遇到这些复杂问题,但是使用基于解析器的方法,它们将更容易解决。

您必须执行两次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);

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

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

我认为这里不需要正则表达式,只需使用javascript内置函数"split"。

  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]

如果您真的想使用纯regexp:

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] }
      }));