【问题标题】:JavaScript RegExp pattern [duplicate]JavaScript RegExp 模式 [重复]
【发布时间】:2012-11-21 06:20:46
【问题描述】:

我有一个类似下面的字符串...

var1=val1 var2=val2 var3="p1 p2 p3 p4" var4="p1 p2" var5=val5

现在如何使用 RegExp 仅在 "" 内将所有 white spaces 替换为 underscore,以便字符串如下所示...

var1=val1 var2=val2 var3="p1_p2_p3_p4" var4="p1_p2" var5=val5

这样通过使用.replace('"','').split(' '),我可以得到一个如下所示的数组...

Array(
   var1: "val1",
   var2: "val2",
   var3: "p1_p2_p3_p4",
   var4: "p1_p2",
   var5: "val5"
)

请不要使用 jQuery...

【问题讨论】:

  • 那不是数组。那是一个对象。
  • 数组是一个对象...我需要一个数组...为了更好地理解我将它显示为对象...
  • @Derek 不是。恐怕是语法错误,或者更可能是 quasiPHP 表示法
  • 等等,var1=val1 var2=val2 是字符串的一部分,还是只是“p1 p2..”位?
  • @tjameson var1=val1 var2=val2 var3="p1 p2 p3 p4" var4="p1 p2" var5=val5 是一个字符串...

标签: javascript regex string


【解决方案1】:

我知道这已经得到解答,但我想我会使用积极的前瞻性来分享这个正则表达式。这允许您在不使用回调的情况下replace

var str = 'var1=val1 var2=val2 var3="p1 p2 p3 p4" var4="p1 p2" var5=val5';

str = str.replace(/\s(?=[^=]*")/g, '_');

解释一下:

\s        match a space...
(?=       start of positive look-ahead
[^=]*"    ...which is followed by anything except an =, up to a double-quote
)         end of positive look-ahead

然后g会重复搜索

【讨论】:

  • 假设引用的字符串中没有=
  • 正确,但由于 Javascript 不支持后视,我不得不挂钩。如果这对发帖人来说是个问题,那么您的答案是更好的答案。
  • 在速度方面,你以很大的优势击败了我(IE除外):jsperf.com/replace-inside-dquotes
  • 不错!我以前没见过 jsperf.com。谢谢。
【解决方案2】:

您希望通过用字符串中的下划线替换空格来将输入字符串中的每个字符串替换为另一个字符串。您可以使用回调替换来做到这一点:

var inp='var1=val1 var2=val2 var3="p1 p2 p3 p4" var4="p1 p2" var5=val5'

var outp=inp.replace(/"[^"]*"/g, function(x){
  return x.replace(/ /g, '_');
})

// var outp === 'var1=val1 var2=val2 var3="p1_p2_p3_p4" var4="p1_p2" var5=val5'

【讨论】:

  • 朋友,请不要介意... garyh 比你有更好的答案... 希望您能理解...
  • @BlackCobra 您可以选择接受的答案。请注意,Garyh 的回答假定引用的字符串中没有 =(并且在它之外有 is 一个 =
【解决方案3】:
var arr = string.replace(/(=")([^"]*)(")/g,function(m,g1,g2,g3){return g1 + g2.replace(/ /g, "_") + g3;}).split(' ');

【讨论】:

  • 和我的想法一样,除了我不需要捕获组 ;-)
  • @JanDvorak 我也不需要它们,因为它们的值是静态的。
  • @asad 您的回答不完整...您的代码返回给我var1=val1 var2=val2 var3="p1_p2 p3 p4 p5 p6 p7 p8" var4="p1 p2" var5=val5... 它仅替换了var3... 的第一个空格,而var4 甚至没有被触及。 .. 将字符串通过' ' 拆分后,它返回给我一个可怕的数组...请在提交前至少检查一次您的代码...您几乎已经完成了代码...
  • @BlackCobra 只是忘了在我的正则表达式末尾添加 g 标志。将此:/(=")([^"]*)(")/ 更改为:/(=")([^"]*)(")/g,它应该可以工作。
  • @BlackCobra 这怎么不完整?
【解决方案4】:

选择您需要的:

对象:

var txt = 'var1=val1 var2=val2 var3="p1_p2_p3_p4" var4="p1_p2" var5=val5',
    arr = txt.split(" "),
    obj = {};

for(var i = 0 ; i < arr.length; i++){
    var ind = arr[i].match(/^(.+)=/)[1],
        val = arr[i].match(/=(.+)$/)[1].replace(/_/g," ");
    obj[ind] = val;
}

console.log(obj);  //This will give you an object.
// {
//     var1: "val1",
//     var2: "val2",
//     var3: ""p1 p2 p3 p4"",
//     var4: ""p1 p2"",
//     var5: "val5"
// }

数组:

var txt = 'var1=val1 var2=val2 var3="p1_p2_p3_p4" var4="p1_p2" var5=val5',
    arr = txt.split(" "),
    list = [];

for(var i = 0 ; i < arr.length; i++){
    var val = arr[i].match(/=(.+)$/)[1].replace(/_/g," ");
    list.push(val);
}

console.log(list);  //This will give you an array.
// [
//     "val1",
//     "val2",
//     ""p1 p2 p3 p4"",
//     ""p1 p2"",
//     "val5"
// ]

【讨论】:

    猜你喜欢
    • 2018-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 2022-06-10
    • 2016-03-03
    相关资源
    最近更新 更多