我确信这个问题有一个微不足道的解决方案,但我似乎无法做到正确:
我想仅在整行与正则表达式匹配时替换行中的特定模式。
所以在我的情况下,只有当整行是数字和管道时,三个管道 | 才应被下划线 _ 替换:
|||10|||-80|||-120|||400 ---> replace
|||10|||asdf|||-120|||400 ---> don't replace
|||10|||-80|||400 ---> replace
|||10|||-80|||-120|||400|||test ---> don't replace
预期结果:
___10___-80___-120___400
|||10|||asdf|||-120|||400
___10___-80___400
|||10|||-80|||-120|||400|||test
我的尝试:
\|\|\|(?=\-?\d+)
替换管道,如果后跟数字按预期,但当然也在“无效”行
^(\|\|\|\-?\d+){1,}$
匹配整行,因此我不能只替换管道
我明白为什么我的模式不起作用,也许我只需要两次通过,但感觉这应该是完全可能的。
答案 0 :(得分:5)
如果没有更多细节,似乎可以使用
(?<=^(?:\|{3}-?\d+)*)\|{3}(?=-?\d+(?:\|{3}-?\d+)*$)
或者,如果您需要在更大的字符串中处理行:
(?m)(?<=^(?:\|{3}-?\d+)*)\|{3}(?=-?\d+(?:\|{3}-?\d+)*\r?$)
请参阅regex demo。
<强>详情:
(?<=^(?:\|{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);
RegexOptions.ECMAScript
标志用于使\d
仅匹配ASCII数字。