如何简化正则?

function excludeSubstring(inputString, substringToDelete) {
  const regex = new RegExp(
    `(^\\b${substringToDelete}\\b,*)|(,*\\b${substringToDelete}\\b)`
  );
  return inputString.replace(regex, "");
}

// 举例
'12,34,56'.replace(/(^12,*)|(,*12)/,'')

如何简化这个正则呢?
或者是否有其他实现方式(正则)?

阅读 2.6k
avatarAI BotBETA

首先,你的正则表达式 (^${substringToDelete},*)|(,*${substringToDelete}) 已经能够正确地匹配以 substringToDelete 开头或结尾的子串。

然而,这个正则表达式在处理某些特殊情况时可能不够理想。例如,如果你的输入字符串是 "12,34,56,12,78",并且你想删除所有的 "12",那么你的正则表达式只会删除第一个 "12",而不会删除后面的 "12"。

这是因为你的正则表达式只能匹配以 "12" 开头或结尾的子串,而不能匹配中间的 "12"。

如果你希望简化这个正则表达式,并让它能够匹配任何位置的 "12",你可以使用以下正则表达式:

`.*${substringToDelete}.*`

这个正则表达式可以匹配任何包含 substringToDelete 的子串,无论它出现在字符串的哪个位置。

但是请注意,这个正则表达式的性能可能不如你原来的正则表达式。在处理大型字符串时,它可能会比原来的正则表达式慢一些。

另一个可能的解决方案是使用 JavaScript 的 splitfilter 方法,而不是正则表达式。例如:

function excludeSubstring(inputString, substringToDelete) {
  return inputString.split(new RegExp(`(${substringToDelete})`, 'g')).filter(Boolean).join('');
}

这个函数会将输入字符串分割成一个数组,数组的每个元素都是一个不包含 substringToDelete 的子串。然后,它将数组转换回字符串。这个函数在处理大型字符串时可能比使用正则表达式更快。

3 个回答

用零宽断言
/(?<=^|,)12(?=,|$)/

'12,34,56,12,34,56,12'.replace(/(?<=^|,)12(?=,|$)/g, '[]')

结果是 [],34,56,[],34,56,[]

删除的话,正则改一下,需要一点点额外 JS 辅助一下

'12,34,56,12,34,56,12'.replace(/(^|,)12(,|$)/g, function($0, $1, $2){
    // console.log($0, $1, $2);
    return ($1===$2 ? ',' : '');
})

结果是 34,56,34,56

如果已知字符串都是 , 隔开的话,可以直接转换为数组过滤,没必要使用正则,这种过滤的方式应该比正则更容易理解吧

let string = '12,34,56,12';

function excludeSubstring(inputString,substringToDelete){
   return inputString.split(',').filter(item => item !== substringToDelete).join(',');
}

excludeSubstring(string,'12');
  const regex = new RegExp(
    `\\b${substringToDelete}\\b,|,${substringToDelete}\\b`
  );
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进