【问题标题】:Parse Artists from string using regex使用正则表达式从字符串中解析艺术家
【发布时间】:2020-06-03 17:20:57
【问题描述】:

我正在尝试读取字符串,例如 使用 javascript 将 "Ludacris feat. Lil Jon, Drake & Elvis Presley" 转换为数组 ["Ludacris", "Lil Jon", "Drake", "Elvis Presley"]

字符串始终具有相同的结构,但有时它们会在 [feat. ... ](feat. ... ) 等特色艺术家周围加上括号

我现在拥有的是: (\s*\b(feat)\b[.]?\s*)|(\s*,\s*)|(\s*&\s*)

当我在https://regex101.com/ 上测试时,它似乎匹配正确,但是,以下代码不起作用

var a = "Ludacris feat. Lil Jon, Drake & Elvis Presley".split(/(\s*\b(feat)\b[.]?\s*)|(\s*,\s*)|(\s*&\s*)/);
console.log(a);

输出是

[
  'Ludacris', ' feat. ',
  'feat',     undefined,
  undefined,  'Lil Jon',
  undefined,  undefined,
  ', ',       undefined,
  'Drake',    undefined,
  undefined,  undefined,
  ' & ',      'Elvis Presley'
]

我在这里错过了什么?

【问题讨论】:

  • 使用非捕获组

标签: javascript regex string split


【解决方案1】:

尝试不带括号。使用捕获组使您可以单独匹配字符串,因此如果您将其与split() 一起使用,则会创建更多未定义的项目@

var a = "Ludacris feat. Lil Jon, Drake & Elvis Presley".split(/\s*\bfeat\b[.]?\s*|\s*,\s*|\s*&\s*/);
console.log(a);

【讨论】:

  • \s 掩盖了实际的正则表达式。也可以使用.split(/feat.|,|&/).map(e => e.trim())
  • 当源字符串包含方括号[...]和圆括号(...)时失败
【解决方案2】:

我不提倡冗长而复杂的正则表达式。它们很难阅读和推理。

当您将正则表达式处理分解成更小的块时,代码变得更容易理解。

let a = "Ludacris [feat. Lil Jon], Drake & Elvis Presley (feat. Elton John)";

// strip all '[]' and '()' characters
let noBrackets = a.replace(/[\[\]\(\)]/g, '');

// repalce all ' feat.' strings with ','
let noFeat = noBrackets.replace(/ feat\./g, ',');

// replace all ' &' with ','
let noAmpersand = noFeat.replace(/ \&/g, ',');

// split into arrays at ', '
let arr = noAmpersand.split(', ');

let result = document.getElementById('result');
result.innerHTML = 'a: ' + JSON.stringify(a);
result.innerHTML += '\n\nnoBrackets: ' +
  JSON.stringify(noBrackets);
result.innerHTML += '\nnoFeat: ' + JSON.stringify(noFeat);
result.innerHTML += '\nnoAmpersand:' +
  JSON.stringify(noAmpersand);
result.innerHTML += '\n\narr: ' + JSON.stringify(arr, null, 2);
<pre id="result"></pre>

【讨论】:

    猜你喜欢
    • 2014-09-22
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 2019-12-10
    相关资源
    最近更新 更多