代码之家  ›  专栏  ›  技术社区  ›  pez

基于动态变量进行拆分并将分隔符保留在数组中

  •  1
  • pez  · 技术社区  · 1 年前

    我需要基于将要更改的动态分隔符来拆分数组,并将分隔符保留在生成的数组中。

    请考虑以下需要说明的示例:

    • 分裂 const match = 'somethingcatsomethingcatsomethingcat'

    • 使用分离器 const separator = 'cat'

    • 并得到以下数组作为结果: ["something", "cat", "something", "cat", "something", "cat"]

    以下是我尝试过的:

    const separator = 'cat'
    const match = 'somethingcatsomethingcatsomethingcat'
    
    const standardSplit = match.split(separator)
    console.log(standardSplit)
    // >> Array ["something", "something", "something", ""]
    
    const withPureRegex = match.split(/(cat)/)
    console.log(withPureRegex)
    // >> Array ["something", "cat", "something", "cat", "something", "cat", ""]
    // This is what I need, without the last element of an empty string.
    // But I need to pass in the separator dynamically.
    
    const regex = new RegExp(`/(${separator})/`, 'gi')
    const withStringLiteral = match.split(regex)
    console.log(withStringLiteral)
    // >> Array ["somethingcatsomethingcatsomethingcat"]
    

    我不擅长正则表达式。我读过一些 articles 关于regex中的转义,但在 RegExp ?我尝试了许多变体 RegExp 没有运气。

    关于这一点有很多问题,但我发现尝试使用动态分离器的问题很少。我发现的几个问题都是使用字符串文字和 RegExp 就像我上面提到的一样。

    如果我只需要做一次,我会使用非regex方法,比如使用第一个 split 方法,然后根据需要手动循环插入分隔符。但在这种情况下,我已经多次运行这个匹配/替换,如果可以避免的话,我不能增加更多的开销。

    3 回复  |  直到 1 年前
        1
  •  2
  •   Mamun    1 年前

    您可以使用删除最后一个空项目 .filter(Boolean)

    演示:

    const match = 'somethingcatsomethingcatsomethingcat';
    const separator = 'cat';
    
    const reg = new RegExp(`(${separator})`, 'g');
    const resArr = match.split(reg).filter(Boolean);
    
    console.log(resArr);
        2
  •  0
  •   Nick    1 年前

    以下是一种非正则表达式的方法:

    • 分离器上的拆分
    • 使用重新加入阵列 `,${separator},`
    • 在上拆分新字符串 ,
    • 过滤掉所有空值

    我用过的笔记 , 作为一种新的分离器;您可以使用任何未出现在原始字符串中的字符。

    const separator = 'cat'
    const match = 'somethingcatsomethingcatsomethingcat'
    
    const result = match.split(separator)
      .join(`,${separator},`)
      .split(',')
      .filter(Boolean)
    
    console.log(result)
        3
  •  0
  •   Cary Swoveland    1 年前

    可以对正则表达式的匹配项进行拆分

    (?<!^| ) *(?=cat)|(?<=cat) *(?! |$)
    

    表达式中写道:“匹配零个或多个空格,前提是它们不以空格开头或在字符串开头,后面跟 "cat" ( | )匹配零个或多个空格,前提是它们前面有 “猫” 并且后面没有空格或在字符串的末尾。 (?=cat) 积极展望 ; (?<=cat) 正面观察 (?<!^| ) 消极落后 ; (?! |$) 消极展望

    Demo

    该链接演示了两个字符串

    "catsomethingcatsomethingcat"
    "cat somethingcatsomething cat"
    

    都被拆分到阵列中

    ["cat", "something", "cat", "something", "cat"]
    

    请注意,分割字符串的某些匹配可能为零宽度,例如在分割字符串时 "catsomething" 进入 “猫” "something"

    愚蠢的 (?<! |^) 例如, " catsomething" 进入 " cat" “某事” .如果我用过 (?<!^) 那根绳子会被分成 " " , “猫” “某事” 。类似于 (?!|$) 而不是 (?!$)