Javascript 仅在第一行中替换正则表达式

Javascript 仅在第一行中替换正则表达式,javascript,regex,regex-lookarounds,Javascript,Regex,Regex Lookarounds,存在多行字符串的转换 !a! b! 应该成为 .a. b. .a. b. c! !d! 及 应该成为 .a. b. .a. b. c! !d! 我回头看了看它: str(/(?<!\n)([^\n!]*)!+/g, '$1.') 拆分字符串并转换第一行似乎很简单。但是,是否有可靠的方法仅用正则表达式替换多行字符串的第一行 我也希望能解释一下我的方法到底出了什么问题,所以它失败了 问题不限于JS正则表达式的味道,但我首先对这个感兴趣。关于您尝试的模式: (?负向后看,断言直接向

存在多行字符串的转换

!a! b!
应该成为

.a. b.
.a. b.
c!
!d!

应该成为

.a. b.
.a. b.
c!
!d!
我回头看了看它:

str(/(?<!\n)([^\n!]*)!+/g, '$1.')
拆分字符串并转换第一行似乎很简单。但是,是否有可靠的方法仅用正则表达式替换多行字符串的第一行

我也希望能解释一下我的方法到底出了什么问题,所以它失败了


问题不限于JS正则表达式的味道,但我首先对这个感兴趣。

关于您尝试的模式:

  • (?负向后看,断言直接向左的不是换行符或
  • ([^\n!]*)
    捕获组1,匹配除换行符或
  • !+
    匹配1+次!(要删除的内容)
模式匹配太多,因为它将匹配所有单独的部分。例如,没有规则说匹配此模式2次,因此每次该模式匹配时,您都将替换为组1

请注意,此部分中的量词是0+倍
([^\n!]*)
,它也将匹配单个!除非前面有换行符


如果可以使用SKIP FAIL,则可以首先匹配要避免的内容,在本例中,这是一行,可以选择以感叹号开头,以感叹号结尾,中间没有

之后,匹配所有其他感叹号,并用点替换它们

^!?[^\r\n!]*!$(*SKIP)(*FAIL)|!


另一种选择是使用2个捕获组

第一组将在第一组感叹号之间匹配,第二组将在后跟除!以外的字符后匹配空格

然后在末尾匹配!使其不在替换中

 !([^\s!]+)!([^\S\r\n]+[^\s!])!
看另一个

在替换中,使用2个带点的捕捉组

.$1.$2.

也许使用2个捕获组<代码>!([^ \r\n++[^ s]!)!< /代码>,用<代码>替换。$ 1。2。也可以使用跳过失败。例如,代码> ^ ^![^ ^ r\n!!*!$(*kip)(*FAILL)!< /代码> @ TeththBood多谢,两个建议看起来不错,考虑把它们作为答案。