Regex 如何匹配正则表达式中替换后的第一个字符? 更新问题

Regex 如何匹配正则表达式中替换后的第一个字符? 更新问题,regex,Regex,我想将所有的'\n'替换为'\r\n',除了那些 “\r\n”已存在,因此我提出了以下建议: '\n\r\n1\n'.替换(/((\r\n)+^ ^[^\r])\n((?!\r)|(?=\r\n))/g,$1\r\n') 但它产生了: ”\r\n\n\r\n1\r\n' 如果我使用,\n\n\r\n1\n.replace(/((\r\n)+^ ^[^\r]|)\n((?!\r)|(?=\r\n))/g,$1\r\n'),它会忽略所有预请求并生成:“\r\n\r\n\r\n1\r\n” 我怎样才能

我想将所有的'\n'替换为'\r\n',除了那些 “\r\n”已存在,因此我提出了以下建议:
'\n\r\n1\n'.替换(/((\r\n)+^ ^[^\r])\n((?!\r)|(?=\r\n))/g,$1\r\n')

但它产生了:
”\r\n\n\r\n1\r\n'

如果我使用
,\n\n\r\n1\n.replace(/((\r\n)+^ ^[^\r]|)\n((?!\r)|(?=\r\n))/g,$1\r\n')
,它会忽略所有预请求并生成:
“\r\n\r\n\r\n1\r\n”

我怎样才能做到呢?非常感谢

顺便说一句,它是在Chrome 68中测试的


原始问题(上下文): 我认为当正则表达式引擎继续测试时,替换的字符将被计算为字符串的一部分。所以我得到了这个

'1111'。替换(/(^ |[^2])1/g,'12')
“2121”

但是现在我被下面的陈述弄糊涂了,我期望的是“2222”

'1111'。替换(/(^ |[^3])1/g,'12')
“2121”

似乎被替换的角色被忽略了。即使使用“.”我也无法捕获它

'1111'。替换(/(^ |)1/g,'12')
“2121”

如何替换示例中的每个“1”

我知道
'1111'.replace(/1/g,2)
可以,但这是一个简化的示例,我想用一些先决条件替换目标,如上面演示的

顺便说一句,它是在Chrome 68中测试的。 模式匹配的
(\r\n)+^ ^[^\r])\n((?!\r)|(?=\r\n))
模式匹配:

  • (\r\n)+^^[^\r])
    -第1组:一个或多个CRLF序列(
    (\r\n)+
    )或(
    )字符串(
    )或除CR以外的任何字符的开头(
  • \n
    -换行符,LF
  • ((?!\r)|(?=\r\n))
    -后面不跟CR或跟CRLF
因此,当应用于
\n\n\r\n1\n
时,会发生以下情况:

  • 在字符串的开头,
    ^
    被捕获到组1中,
    \n
    被匹配,
    (?!\r)
    返回true,因此存在匹配(第一个
    \n
    被匹配)。它被替换为
    \r\n
    ,因为
    $1
    是空字符串。结果是当前的
    \r\n
  • 将从第二个
    \n
    中搜索下一个匹配项(
    \n\r\n1\n
    仍有待使用)<代码>\n被捕获到具有
    [^\r]
    的组1中,
    \r
    不匹配
    \n
    =>失败<代码>\n被放回,正则表达式索引前进到下一个位置。在这里,结果中有
    \r\n\n
  • \r\n1\n
    仍有待使用<代码>\r不匹配,因此按原样添加到结果中,
    \r\n\r
    \n1\n
    仍有待使用
  • \n
    [^\r]
    一起被捕获到组1,
    1
    无法与
    \n
    匹配,未找到匹配项,
    \n
    追加到结果中,
    \r\n\r\n
  • 1\n
    仍有待使用
    1
    [^\r]
    匹配,
    \n
    \n
    匹配,
    (?!\r)
    返回true=>存在匹配项,因此该
    1\n
    替换为
    1\r\n
    (因为
    $1
    包含
    1
您可以匹配
\r\n
序列,然后在其他上下文中匹配
\n
字符,并将两者替换为
\r\n

console.log(
JSON.stringify('\n\n\r\n1\n'.replace(/\r\n |\n/g,'\r\n'))

);请告诉我们真正的问题,而不是它的简化版本。你想在这里做什么?好吧,在这里查找将起作用,
(?为什么简单版本无效?你的先决条件是什么?@TimBiegeleisen感谢你的时间,我用一个真正的问题更新了这个问题。@WiktorStribiżew不幸的是,从Chrome 68或node 8.9.4开始,没有--HarmonyThank,Lookback就不受支持了。这是一个更体面的解决方案,我仍然很好奇为什么有些字符不受支持在这种情况下无法通过捕获组方式捕获。您知道吗?@pansila您想了解哪个正则表达式,
((\r\n)+^ ^ ^[^\r])\n((?!\r)|(?=\r\n))
(^ ^ 124;)1/g
。@pansila我在顶部添加了解释。非常感谢您的详细解释。@pansila我已经发布了答案,
。请替换(/\r\n |\n/g,'\r\n')
。您的方法无法工作,我解释了原因。如果支持,则需要查找,
(?)?。