2 regex 独立工作正常,但组合时不工作

2 regex work correctly independently but they don't when combined

我想根据标点符号拆分字符串,同时保留标点符号,如果字符串用大括号括起来,则删除大括号而不是单词。

我当前的正则表达式几乎可以完美运行。如果它是字符串中的最后一个字符,它不会捕获标点符号。感谢您的帮助

// const re = /([.!\"'/$:\d]+)/g;
// const re = /{(.*?)}/g

const re =  /([.!\"'/$:\d]+)| {(.*?)}/g

const delimiter= new RegExp(re);
const sentences = sentence.split(delimiter);
sentences = sentences.filter(Boolean);

console.log(sentences)


输入:

const sentence = `Lorem ipsum {dolor sit} amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et {dolore magna aliqua}. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat! Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum?`

实际输出:

[
  'Lorem ipsum',
  'dolor sit',
  ' amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et',
  'dolore magna aliqua',
  '.',
  'Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat',
  '!',
  'Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur',
  '.',
  'Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum?'
]

期望的输出:

[
  'Lorem ipsum',
  'dolor sit',
  ' amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et',
  'dolore magna aliqua',
  '.',
  'Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat',
  '!',
  'Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur',
  '.',
  'Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum',
  '?'
]

您可以使用

/\s*{([^{}]*)}|([`!@#$%^&*()_+=[\]{};':"\|.<>\/?~-])/

或者 - 更紧凑一点:

/\s*{([^{}]*)}|(?!,)([!-\/:-@[-`{-~])/

[`!@#$%^&*()_+=[\]{};':"\|.<>\/?~-](?!,)([!-\/:-@[-`{-~]) 模式都匹配除 , 之外的所有 ASCII 标点符号和符号。主要区别在于 \s* 部分:{{ 之前的 space 是强制性模式,*\s* 匹配零次或多次出现的 whitespace 个字符。

JS 演示:

var sentence = "Lorem ipsum {dolor sit} amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et {dolore magna aliqua}. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat! Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum?";
var delimiter =  /\s*{([^{}]*)}|([`!@#$%^&*()_+=[\]{};':"\|.<>\/?~-])/;
var sentences = sentence.split(delimiter).filter(Boolean);
console.log(sentences);