javascript 如何通过一个分隔符拆分字符串,但具有如下所述的特定格式

jm81lzqq  于 2022-12-10  发布在  Java
关注(0)|答案(3)|浏览(216)

我有一串像:

const str = 'My [Link format](https://google.com) demo'

我希望单词array是这样的:

['My', '[Link format](https://google.com)', 'demo']

在javascript中做什么?
我试着使用split()和str.match(),但还没有成功。

3gtaxfhh

3gtaxfhh1#

这是对作为分隔符的空格的简单拆分,但我们使用负前瞻来检查左右方括号[]和圆括号()的组合

const str = 'My [Link format](https://google.com) demo'
console.log(str.split(/\s+(?![^\[]*\])(?![^\(]*\))/));
  • 我们还允许URL部分包含空格,尽管出现空格的可能性很低,但仍有可能发生

请在此处尝试:https://jsfiddle.net/m4q6e9x7/

["My", "[Link format](https://google.com)", "demo"]

在小提琴中,我试着向两个独立的消极旁观者展示了括号类型的组合:* (我在圆括号中添加了一个空格以证明此概念)*

const str = 'My [Link format](http s://google.com) demo'

忽略[]之间的空格

console.log(str.split(/\s+(?![^\[]*\])/));
["My", "[Link format](http", "s://google.com)", "demo"]

忽略()之间的空格

console.log(str.split(/\s+(?![^\(]*\))/));
["My", "[Link", "format](http s://google.com)", "demo"]

因此,我们可以轻松地将这两个条件结合起来,因为我们需要它们都“不”匹配。
因为[]()需要转义,所以如果我们修改并测试大括号{}之间的空格,可能会更容易看到正则表达式

const str = 'My {Link format}(https://google.com) demo'
console.log(str.split(/\s+(?![^{]*})/));
["My", "{Link format}(https://google.com)", "demo"]
5rgfhyps

5rgfhyps2#

这两种解决方案都假设字符串的格式正确(基本上是指“]”和“('之间没有空格,[...]中没有”]“字符),并且直觉相似。除了具体的例子之外,您并没有提供关于输入字符串可以是什么的信息--因此解决方案在这种情况下以及非常类似的情况下都能很好地工作。第二种解决方案很容易根据需要进行修改,first很容易扩展到检查字符串是否实际上不正确。

使用正则表达式的解决方案

下面的代码查找第一个'['之前的所有内容,'[...](...)'模式中的所有内容(注意:第一个......不能包含']',第二个- ')',但我认为这将使一个不正确的输入摆在首位),以及之后的一切。

let regex = /(.*)(\[.*\]\(.*\))(.*)/
    let res = str.match(regex).splice(1,3)

给出res

['My ', '[Link format](https://google.com)', ' demo']

从那里,你可以修剪这个数组('My ' => 'My')中的每一个条目,例如使用trim函数,如下所示:

res.map((val) => val.trim());

请查看此处以了解数组从.match获取的内容()方法表示,但通常除了索引0之外,它包含捕获组,即字符串的部分对应于用括号括起来的正则表达式的部分。如果您不熟悉正则表达式(regexes)在JS中,或者根本就在,你会很容易地找到很多关于这个主题的在线资源,在掌握了基础知识之后,regex101是一个很好的工具来实验正则表达式并探索它们的功能。当使用它时,你可能应该从左边的菜单中选择EcmaSCRIPT/JS风格。

不带正则表达式的等效解决方案

等效的解决方案是手动查找第一个'['在哪里,以及'[...]在哪里(...)'模式结束。然后拼接部分(在“[”之前、模式之后和模式之后),并可能修剪它们。因此,只需循环字符串的字符以搜索“[”,而不是“]",(',')'。注意,在这种情况下,如果字符串具有意外/不正确的形式,您可以轻松地、粒度地决定如何处理。
TODO:我可能会在有时间时草拟一些程式码

ibps3vxo

ibps3vxo3#

正则表达式是你的朋友!

const regexMdLinks = /!?\[([^\]]*)\]\(([^\)]+)\)/gm

// Example md file contents
const str = `My [Link format](https://google.com) demo My [Link format2](https://google.com/2) demo2`

let regex_splitted = str.split(regexMdLinks);
let arr = [];
//1. Item will be the text (or empty text)
//2. Item is the link text
//3. Item is the url
for(let i = 0; i < regex_splitted.length; i++){
  if(i % 3 == 0){ //Split normal text
    arr.push(...regex_splitted[i].split(" ").filter(i => i));
  } else if(i % 3 == 1){//Add brackets around link text
    arr.push("["+regex_splitted[i]+"]");
  } else {
    arr.push("("+regex_splitted[i]+")");
  }
}

console.log(arr)

相关问题