如果整行与正则表达式匹配,则仅替换模式

use*_*022 4 .net c# regex

我确信这个问题有一个简单的解决方案,但我似乎无法做到正确:
我只想在整行与正则表达式匹配时替换一行中的特定模式.

所以在我的情况下|,_只有当整行是数字和管道时,三个管道才应该用下划线代替:

|||10|||-80|||-120|||400           ---> replace
|||10|||asdf|||-120|||400          ---> don't replace
|||10|||-80|||400                  ---> replace
|||10|||-80|||-120|||400|||test    ---> don't replace
Run Code Online (Sandbox Code Playgroud)

预期结果:

___10___-80___-120___400
|||10|||asdf|||-120|||400
___10___-80___400
|||10|||-80|||-120|||400|||test
Run Code Online (Sandbox Code Playgroud)

我的尝试:

\|\|\|(?=\-?\d+)
Run Code Online (Sandbox Code Playgroud)

如果按照预期后跟数字,则替换管道,但当然也在"无效"行中

^(\|\|\|\-?\d+){1,}$
Run Code Online (Sandbox Code Playgroud)

匹配整行,因此我不能只更换管道

我理解为什么我的模式不起作用,也许我只需要两次通过,但感觉这应该是完全可能的.

Wik*_*żew 5

没有更多细节,似乎你可以使用

(?<=^(?:\|{3}-?\d+)*)\|{3}(?=-?\d+(?:\|{3}-?\d+)*$)
Run Code Online (Sandbox Code Playgroud)

或者,如果您需要处理更大的字符串中的:

(?m)(?<=^(?:\|{3}-?\d+)*)\|{3}(?=-?\d+(?:\|{3}-?\d+)*\r?$)
Run Code Online (Sandbox Code Playgroud)

请参阅正则表达式演示.

在此输入图像描述

细节:

  • (?<=^(?:\|{3}-?\d+)*) - 一个积极的外观,需要立即在当前位置的左侧,有:
    • ^ - 字符串锚的开始
    • (?:\|{3}-?\d+)*- 零个或多个3 |秒的序列,然后是可选的-(-?),然后是1个或多个数字
  • \|{3} - 3管
  • (?=-?\d+(?:\|{3}-?\d+)*$) - 一个积极的前瞻,要求,立即在当前位置的右侧,有
    • -?\d+- 一个可选的-,然后是1+个数字
    • (?:\|{3}-?\d+)*- 0个或更多个3 |s 序列+一个可选的-,然后是1+个数字
    • $ - 字符串锚点结束.

C#:

var res = Regex.Replace(s, @"(?<=^(?:\|{3}-?\d+)*)\|{3}(?=-?\d+(?:\|{3}-?\d+)*$)", "___", RegexOptions.ECMAScript);
Run Code Online (Sandbox Code Playgroud)

RegexOptions.ECMAScript标志用于\d仅匹配ASCII数字.