【问题标题】:Split string with specific formation Angular 6, Typescript具有特定格式的拆分字符串Angular 6,Typescript
【发布时间】:2019-05-02 11:00:16
【问题描述】:

我正在尝试将正则表达式与 javascript 一起使用,我有以下列表:

word1 @['id1', 'name1']@ @['id2', 'name2']@ @['id3', 'name3']@ word2 @['id4', 'name4']@ word3 @['id5', 'name5']@

我想检测所有内容:@[' .....']@ 并像这样拆分它们:

word1
@['id1', 'name1']@
@['id2', 'name2']@
@['id3', 'name3']@
word2
@['id4', 'name4']@
word3
@['id5', 'name5']@

所以我可以稍后读取 id 和名称以便能够创建链接:

<a href="url/[id]">[name]</a>

我试过这个正则表达式:

[@\['](.)*['\]@]

但它只是标记从第一个 @[' 到 name5 结尾的所有内容。

简单代码:

const reg = /[@\['](.)*['\]@]]/;
const arr = content.split(reg);

如果有人知道如何拆分它,我将不胜感激分享解决方案。 谢谢!

【问题讨论】:

    标签: javascript regex angular typescript


    【解决方案1】:

    而不是split,考虑.match,这可能会使逻辑更容易:要么匹配单词字符,要么匹配@[,后跟任何字符,然后是]@

    \w+|@\[.*?\]@
    

    const input = `word1 @['id1', 'name1']@ @['id2', 'name2']@ @['id3', 'name3']@ word2 @['id4', 'name4']@ word3 @['id5', 'name5']@`;
    console.log(input.match(/\w+|@\[.*?\]@/g));
      

    如果[] 内部可能包含您不想匹配的]@s,例如@['id1', ']@', 'name1']@,那么您将需要更多逻辑 - 在[]s 内部,重复组'" 分隔字符串:

    \w+|@\[(?:(?:'[^']+'|"[^"]+")(?:, *|(?=\])))*\]@
    

    https://regex101.com/r/rDW2iD/1

    【讨论】:

    • 哦,我错过了在开头添加 \w。谢谢!我想这就是我正在寻找的解决方案!
    • 如何获取结果数组?
    • 按“运行代码 sn-p” - .match 返回一个包含所有结果的数组
    • 它有效。我忘了在最后添加 g 以匹配所有内容。谢谢!这正是我想要的。
    【解决方案2】:

    你可以使用分割字符串

    s.split(/\s*(@\[.*?]@)\s*/).filter(Boolean)
    

    查看 JS 演示:

    var s = "word1 @['id1', 'name1']@ @['id2', 'name2']@ @['id3', 'name3']@ word2 @['id4', 'name4']@ word3 @['id5', 'name5']@";
    console.log(s.split(/\s*(@\[.*?]@)\s*/).filter(Boolean));

    该模式匹配 0+ 个空格,然后捕获 @[、除换行符之外的任何 0+ 个字符,尽可能少,直到第一个 ]@,然后匹配而不捕获 0+ 个空格。捕获的子字符串位于结果数组中,.filter(Boolean) 删除空项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      • 1970-01-01
      相关资源
      最近更新 更多