我确信这个问题有一个简单的解决方案,但我似乎无法做到正确:
我只想在整行与正则表达式匹配时替换一行中的特定模式.
所以在我的情况下|,_只有当整行是数字和管道时,三个管道才应该用下划线代替:
|||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)
匹配整行,因此我不能只更换管道
我理解为什么我的模式不起作用,也许我只需要两次通过,但感觉这应该是完全可能的.
没有更多细节,似乎你可以使用
(?<=^(?:\|{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数字.