我想使用前瞻性正则表达式替换System.Text.RegularExpression.Replace(...)
方法。
现在我想知道出了什么问题。看看这个示例代码:
string input = "stackoverflow";
string replacement = "#";
var pattern1 = "(?=[a-z])o";
var result1 = Regex.Replace(input, pattern1, replacement);
// result1 = stack#verfl#w (as expected)
var pattern2 = "(?=[a-k])o";
var result2 = Regex.Replace(input, pattern2, replacement);
// result2 = stackoverflow (expected: stack#overflow)
var pattern3 = "(?=k)o";
var result3 = Regex.Replace(input, pattern3, replacement);
// result3 = stackoverflow (expected: stack#overflow)
var pattern4 = "[a-k]";
var result4 = Regex.Replace(input, pattern4, replacement);
// result4 = st###ov#r#low (as expected)
var pattern5 = "([a-k])o";
var result5 = Regex.Replace(input, pattern5, "$1#");
// result5 = stack#verflow" (as expected)
这很奇怪。
我可以在我的前瞻表达中使用[a-z]
,但不能[a-k]
甚至k
。
我真正想要的是最后一个例子(pattern5)的结果。这是一个很好的,但我很认真,为什么pattern2或pattern3不会返回预期的。结果
答案 0 :(得分:2)
我认为你的想法有点混乱。当你说,在模式2中,
(?=[a-k])o
这意味着“当我们在下一个角色是从a
到k
的位置时,匹配o
”。毫无疑问,这永远不会匹配 - 如果我们处于下一个字符 从a
到k
的地方,那么也会去是一个o
!
模式3甚至更加严峻
(?=k)o
表示“当我们在下一个字符为k
的地方时,匹配o
”。再一次,没有比赛。
pattern1 与匹配的原因是因为o
位于a-z
,所以每当下一个字符为o
时,它也符合“标准” a
到z
'中的内容,因此匹配。
我也不确定为什么你期望#
不要在2和3中替换o
。如果5正在做你想要的,那么你肯定可以使用它吗?我不能轻易地看到如何使用前瞻来做5正在做的事情 - 执行操作'匹配(仅)o
<{>>之前来自{{ 1}}到a
',后面的 似乎是明显的答案:
k
应该匹配这样的(?<=[a-k])o
(但我自己没有运行过)。
答案 1 :(得分:1)
问题是,(?=匹配当前输入但不向前移动。所以(?= [az])匹配“o”,而不是向前移动,然后你匹配“o” ”
你想看看背后吗? “(?&lt; = k)o”会为你工作吗?