如何使用一系列正则表达式分割字符串并保持字符串的原始顺序?

时间:2019-04-04 00:23:27

标签: javascript regex

我有一个长字符串,可以包含需要更改的特定文本。我如何才能将段落作为一个字符串并执行包含一系列正则表达式的字符串拆分,同时保留不需要更改的文本。

截至目前,我有一个正则表达式正在提取需要更改的文本,而将其余部分排除在外。

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&^%"]

无论包含哪些字符,如何使数组保持段落的原始顺序?

1 个答案:

答案 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方法更容易读写。