我有一个长字符串,可以包含需要更改的特定文本。我如何才能将段落作为一个字符串并执行包含一系列正则表达式的字符串拆分,同时保留不需要更改的文本。
截至目前,我有一个正则表达式正在提取需要更改的文本,而将其余部分排除在外。
var regex = /[A-Z]+-[0-9]+[\s]+specificText+[\s]+[0-9)]+[\s]+|specificText[\s]+[0-9]+/gi
var str = "KJSDHFS345 KJSDHFS345 BLAH-3242352 specificText 456 specificText 564 SAUHAUH&^% SAUHAUH&^%"
str.match(regex);
当前,我收到以下结果:
["BLAH-3242352 specificText 456 ", "specificText 564"]
但是,我正在寻找一种方法来返回这样的数组:
["KJSDHFS345 KJSDHFS345 ", "BLAH-3242352 specificText 456 ", "specificText 564", " SAUHAUH&^% SAUHAUH&^%"]
无论包含哪些字符,如何使数组保持段落的原始顺序?
答案 0 :(得分:2)
使用split
而不是match
可能会更容易:捕获您想要的子字符串,它们将与不匹配的部分分开,而包括结果数组中的所有内容:
var regex = /([A-Z]+-[0-9]+[\s]+specificText+\s+[0-9)]+\s+|specificText\s+[0-9]+)/i
var str = "KJSDHFS345 KJSDHFS345 BLAH-3242352 specificText 456 specificText 564 SAUHAUH&^% SAUHAUH&^%"
console.log(str.split(regex).filter(Boolean));
(请注意,仅具有单个标记的字符类是多余的;您可以仅使用单个标记,而split
设置时则不需要全局标志)
如果您必须使用match
,我想这是一个丑陋的方法,那就是用<any characters which aren't the start of a match to the original pattern>
替换您的原始模式:
var regex = /[A-Z]+-[0-9]+\s+specificText+\s+[0-9)]+\s+|specificText\s+[0-9]+|(?:(?![A-Z]+-[0-9]+\s+specificText+\s+[0-9)]+\s+|specificText\s+[0-9]+).)+/gi
// ^^^^^^^ ...
var str = "KJSDHFS345 KJSDHFS345 BLAH-3242352 specificText 456 specificText 564 SAUHAUH&^% SAUHAUH&^%"
console.log(str.match(regex));
但是我不推荐使用-split
方法更容易读写。