是否可以在1个正则表达式中进行2个替换操作?

时间:2018-09-28 12:16:12

标签: javascript regex

我有如下文本数据

ix <- head(which(string == "<TEXT>"), 2)
if (length(ix) == 2) string[seq(ix[1] + 1, ix[2] - 1)]
## [1] "some text"

我应该返回aaa bbb ccc

目前,我分两步实现此目标:

  1. 'aaa','bbb','ccc'替换为[\r\n]+
  2. ','替换为($|^)

是否可以仅通过1个步骤执行相同操作?

3 个答案:

答案 0 :(得分:2)

好吧,如果这只是出于好奇,您可以使用函数替换值来执行此操作。我永远不会建议为此目的实际使用它,但是应该这样做:

const s = `aaa
bbb
ccc`

const s2 = s.replace(/$|^|\n/g, (s) => s === '\n' ? "','" : "'")

console.log(s2)

但是,当然,从某种意义上讲,我在作弊,并不是在这里真正使用RegEx基础知识,只是将逻辑放在回调函数中。

是的,可以做到。

但是请不要在任何地方使用它。

(哦,我简化为仅检查'\n'。显然,您可以根据需要将其扩展到[\r\n]+。)

答案 1 :(得分:1)

您可以使用与Scott suggested in his answer相同的方法来使用更可靠的解决方案,但我的建议基于捕获组,该组将用于确定使用哪种替换逻辑而不是列出您需要替换的所有可能字符。

因此,这是经过稍微修改的解决方案:

const s = `aaa
bbb
ccc`

const s2 = s.replace(/$|^|([\r\n]+)/g, ($0,$1) => $1 ? "','" : "'")

console.log(s2)

兴趣点

  • /$|^|([\r\n]+)/g模式匹配多次出现的字符串开头或结尾,或者匹配并将1+次出现的CR或LF捕获到组1中
  • 现在,通过($0,$1),我们可以访问整个比赛和第1组($1
  • 如果第1组没有定义,如果匹配,则用','替换,否则,用'$1 ? "','" : "'")替换。

答案 2 :(得分:0)

不。一次只能使用一个替换关键字。