2个regex可以单独使用,但结合起来就不行了。

问题描述 投票:1回答:1

我想根据标点符号来拆分一个字符串,同时保留标点符号,如果一个字符串用大括号包住,也要删除大括号,但不删除单词。

我现在的regex工作得很完美。如果标点符号是字符串中的最后一个字符,它就不会被捕获。谢谢你的帮助

// 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',
  '?'
]
regex regex-group
1个回答
0
投票

你可以使用

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

或者--更紧凑一些。

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

两种 [`!@#$%^&*()_+=[\]{};':"\\|.<>\/?~-](?!,)([!-\/:-@[-`{-~]) 模式匹配所有ASCII标点符号和符号以外的字符。,. 主要区别在于 \s* 部分:你的空间前 {{ 是一个强制性的模式,与 *, \s* 匹配0个或更多的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);
© www.soinside.com 2019 - 2024. All rights reserved.