【问题标题】:how can I ignore a variable string length between two known strings when splitting in Javascript?在 Javascript 中拆分时,如何忽略两个已知字符串之间的可变字符串长度?
【发布时间】:2021-06-03 11:23:21
【问题描述】:

我是 JavaScript 的新手,对一般编码来说还是个新手,但我正在尝试尽可能多地自学。

我正在尝试从变量字符串中提取数据。原始字符串格式如下:

CAMERA NAME(NUM):   North West Rd(D1) 
CAMERA NAME(NUM):   Even Longer Camera Name(D2) 
CAMERA NAME(NUM):   Cam13(D13)

我想要的只是最后括号内的字符串。我希望有一个拆分功能,我可以说一些类似于

str.split(CAMERA NAME(NUM):    **variable Characters and length** (,);

但我不确定如何解释 (NUM): 和 (

如果有任何建议,我将不胜感激,谢谢!

P.s - 我目前正在使用这种可行的方法,但我想知道如何为未来的项目考虑变量字符串,因为这几乎肯定会再次出现。

谢谢。 卢克

var txt = msg.payload;
var array = [];
var newTxt = txt.split('(');
//node.warn(newTxt);
for (var i = 1; i < newTxt.length; i++) {
   array.push(newTxt[i].split(')')[0]);
}
//node.warn(array[1]);
msg.payload = array[1];
return msg;

【问题讨论】:

  • 使用正则表达式,卢克。
  • 例如^.+\((.+)\)$

标签: javascript regex string split


【解决方案1】:

如果你的结果总是像你提供的例子一样,你可以用一个班轮做到这一点:

let val = "CAMERA NAME(NUM):   North West Rd(D1)"
let res = val.split("(").pop().replace(")", "")
console.log(res)

let val = ["CAMERA NAME(NUM):   North West Rd(D1)",
  "CAMERA NAME(NUM):   Even Longer Camera Name(D2)",
  "CAMERA NAME(NUM):   Cam13(D13)"
]

val.forEach(i => {
  let res = i.split("(").pop().replace(")", "")
  console.log(res)
})

在( 处拆分字符串,使用pop() 取出数组的最后一个,并删除)

【讨论】:

    【解决方案2】:

    使用正则表达式:

    const val = 'CAMERA NAME(NUM):   Even Longer Camera Name(D2)';
    const id = val.replace(/^.+\((.+)\)$/, '$1');
    

    【讨论】:

      【解决方案3】:

      我会使用正则表达式来解决这个问题。 您可以使用 https://regexr.com/5uaag 对 Regex 进行实验

      // move all relevant information to groups
      var regex = /([^\n()]+)\(([^()]+)\):\s*([^()]+)\(([^()]+)\)/g;
      
      // ([^\n()]+): move all Chars that are not newlines or brakes in a group
      //  \(([^()]+)\): move all chars wrapped in brakes to a group
      
      var test = `CAMERA NAME(NUM):   North West Rd(D1)
      CAMERA NAME(NUM):   Even Longer Camera Name(D2)
      CAMERA NAME(NUM):   Cam13(D13)`;
      
      var cameras = [];
      var match = regex.exec(test);
      
      while(match) {
        // attributes can be changes as you wish
        cameras.push({
          name: match[1],
          num: match[2],
          location: match[3],
          locationTag: match[4]
        });
        match = regex.exec(test);
      }
      
      console.log(cameras);
      // now you can iterate the cameras array and read the information easily

      【讨论】:

        【解决方案4】:

        正如您提到的,有 2 个部分,您可以匹配它们,确保它们都存在,同时捕获组中的最后一部分。

        \([^()]+\):.*\(([^()]+)\)$
        
        • \([^()]+\):匹配以:结尾的括号部分
        • .* 可选匹配任何字符(可变部分)
        • \(([^()]+)\) 匹配 (,在 group 1 中捕获除括号外的任何字符,并匹配 )
        • $ 字符串结束

        Regex demo

        const regex = /\([^()]+\):.*\(([^()]+)\)$/gm;
        const s = `CAMERA NAME(NUM):   North West Rd(D1)
        CAMERA NAME(NUM):   Even Longer Camera Name(D2)
        CAMERA NAME(NUM):   Cam13(D13)`;
        console.log(Array.from(s.matchAll(regex), m => m[1]));

        【讨论】:

          【解决方案5】:

          使用正则表达式:

          const aCamera = [
            "CAMERA NAME(NUM):   North West Rd(D1)",
            "CAMERA NAME(NUM):   Even Longer Camera Name(D2)",
            "CAMERA NAME(NUM):   Cam13(D13)"
          ];
          const oRegex = /\(([A-Za-z0-9]+)\)$/;
          
          aCamera.forEach(sCamName => {
             let aResult = sCamName.match(oRegex);
             if(aResult && aResult [1]){ //Check if there's a result
              console.log(aResult [1]);
             }       
          });

          【讨论】:

          • 我认为最简单高效的。
          • 将 * 更改为 + 并确保在执行 [1] 之前匹配,因为在 null 上执行 [1] 会引发错误。
          • @CasimiretHippolyte 当 OP 没有提到这样的标准时,它还需要在大括号内限制字符集。
          • @some: 可以使用:aArray.reduce((c,s) =&gt; { m=s.match(regex); return m ? [...c,m[1]] : c }, []);
          • @Alnitak:这不是一个真正的问题,很容易将字符类更改为您想要的任何内容。这里最重要的是模式直接以文字括号开头,而这无需尝试检查字符串的开头。
          猜你喜欢
          • 2021-10-09
          • 1970-01-01
          • 2012-11-15
          • 2023-04-09
          • 1970-01-01
          • 1970-01-01
          • 2020-03-11
          • 1970-01-01
          • 2013-07-25
          相关资源
          最近更新 更多