javascript - 如何使用正则表达式根据表达式中的多个字符拆分 str?

标签 javascript regex split delimiter

抱歉,如果措辞不好。因此,我试图找出如何将多个字符长的字符串匹配传递到我的动态正则表达式中。

我的 else 语句中的正则表达式适用于传入 1 个字符,因此我尝试执行相同的操作,除了在第一个 if 语句中传递多个字符之外。

const delimiter = str.slice(0, str.indexOf('\n'));
  const strLength = delimiter.length;
  if (delimiter[0] === '[' && delimiter.charAt(strLength - 1) === ']') {
    const customDelimiter = delimiter.slice(delimiter.indexOf(delimiter[1]), delimiter.indexOf(delimiter.charAt(strLength - 1)));
    console.log(customDelimiter) // => '***'
    const regex = new RegExp(`,|\\n|\\${customDelimiter}`,'g');
    return strArr = str.split(regex).filter(Boolean);
  } else {
    const firstChar = str.slice(0, 1); // => '*'
    const regex = new RegExp(`,|\\n|\\${firstChar}`,'g');
    return strArr = str.split(regex).filter(Boolean);
  }

例如我想要这个字符串: '[*]\n11***22***33' 等于 66 b/c,它应该使用 '*' 分隔符将其拆分为 [11, 22, 33] 数组。我收到一条错误消息:“SyntaxError: 无效的正则表达式:/,|\n|***/: 没有可重复的内容”。

最佳答案

当您在正则表达式中使用 * 作为分隔符时,它会变成 ,|\\n|\\|\*,这是正确的正则表达式。 它匹配“,”或“\n”或“*”字符。 对于您的字符串,它匹配 [***]\n11***22***33 .

但是当您在正则表达式中使用 *** 作为分隔符时,它会变成 ,|\\n|\\|\***,这是不正确的。这里它的末尾有两个未转义的 * 。正则表达式中的 * 表示 0 个或多个前面的模式。你不能将它们两个放在一起。

这是一种特殊情况,因为 * 在正则表达式中具有特殊含义。 如果您使用任何非正则表达式字符,它就会起作用。

一个更简单的解决方案是使用 javascript split 函数来轻松获得所需的结果。 您可以首先使用 \n 分割字符串。

let splitStr = str.split('\n');
// This would return ["[***]", "11***22***33"]

然后使用分隔符分割 splitStr 的第一个索引。

splitStr[1].split('***');
// splitStr[1].split(customDelimiter)
// This would return ["11", "22", "33"]

使用此功能,您不需要使用 if 或 else 语句来分隔单字符分隔符和多字符分隔符。

关于javascript - 如何使用正则表达式根据表达式中的多个字符拆分 str?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58195141/

相关文章:

ruby - 多个匹配项的公共(public)前缀

ruby - 正则表达式以匹配最后一次出现

vim - 从命令行设置 Vim 窗口大小和选择

java - BufferedReader 并填充一个 int 数组

c# - 使用 REGEXP 在 C# 中使用 Sqlite

perl - 在 Perl 中,如何将此 CSV 字符串中的字段放入不带空格的数组中?

javascript - OpenAI 转录 API 返回 400 错误请求

javascript - 长轮询和服务器行为

javascript - 悬停时在html文本中一个一个地改变字母的颜色

javascript - 如何使用加减按钮和输入框创建总计