我有一根绳子

const s = 'pong-ping-bink-ping-pong-ping-donk';

我想用除pingpong以外的所有单词来表示正则表达式.

对于这个字符串,我需要一个被-bink--donk-拆分的数组

"pong-ping",
"ping-pong-ping"

另一个例子

const s = 'ping-pong-ping-pong-fong-song-pong-bing';

"ping-pong-ping-pong",
"pong"

这就是我现在所做的

const s = 'ping-pong-ping-pong-fong-song-pong-bing';

const r = /-(?!ping|?!pong)-/g;
const result = s.split(r);

console.log(result);

我显然离目标还很远.它返回Uncaught SyntaxError: Invalid regular expression: Nothing to repeat

我该怎么办?

推荐答案

您可以使用此正则表达式进行拆分:

/(?:-(?!p[io]ng)\w+)+-?/g

然后过滤掉空结果,只需用途:

str.split(/(?:-(?!p[io]ng)\w+)+-?/g).filter(Boolean)

RegEx Demo

Code:

const rx = /(?:-(?!p[io]ng)\w+)+-?/g;

function splt(s) {
    return s.split(rx).filter(Boolean);
}

const p = 'pong-ping-bink-ping-pong-ping-donk';
console.log(splt(p));

const r = 'ping-pong-ping-pong-fong-song-pong-bing';
console.log(splt(r));

RegEx Details:

  • (?:: Start a non-capture group
    • -:匹配-
    • (?!p[io]ng):消极展望,断言我们当前位置的右侧没有pingpong
    • \w+:匹配1+个单词字符
  • )+:关闭非捕获组并重复该组1+次
  • -?:可选匹配-

Javascript相关问答推荐

如何在不指定宽度和高度的情况下显示来自网址的下一张图像

JavaScript文本区域阻止KeyDown/KeyUp事件本身上的Alt GR +键组合

materialized - activeIndex返回-1

Cypress -使用commands.js将数据测试id串在一起失败,但在将它们串在一起时不使用命令有效

提交表格后保留Web表格中的收件箱值?

react—router v6:路由没有路径

google docs boldText直到按行执行应用脚本错误

如何在输入元素中附加一个属性为checkbox?

如何在Vue 3中创建自定义 Select 组件,并将选项作为HTML而不是props 传递?

如何从HTML对话框中检索单选项组的值?

我在Django中的视图中遇到多值键错误

从Nextjs中的 Select 项收集值,但当单击以处理时,未发生任何情况

使用getBorbingClientRect()更改绝对元素位置

创建以键值对为有效负载的Redux Reducer时,基于键的类型检测

无法避免UV:flat的插值:非法使用保留字"

Reaction-SWR-无更新组件

Phaser3 preFX addGlow不支持zoom

是否可以在不更改组件标识的情况下换出Reaction组件定义(以维护状态/引用等)?如果是这样的话,是如何做到的呢?

无法使用npm install安装react-dom、react和next

为什么我的SoupRequest";被重置为初始值,以及如何修复它?