好的,所以我讨厌问RegEx问题,因为我喜欢自己解决这些问题。另外,它在另一端变得相当烦人,因为人们可能会一直问愚蠢的“你为什么不查看”问题。
我的要求很简单。我想使用Regex.Replace
将匹配替换为上下文敏感值。我为此使用了MatchEvaluator
。但为了简单起见,我可以说我匹配%v
我希望%v
可以逃避,所以如果我使用\%v
则不会匹配。其他任何东西都应该匹配。
我想出的模式是:(?:[^\\]|^)%v
如果它出现在字符串的开头,或者它跟在除%v
之外的任何字符之后,它基本上匹配\
。它不捕获表达式的第一部分。
我知道这不是“正确”的做法。但它工作得很好,直到我注意到当我在替换中使用此模式时,它包含替换前%v
之前的字符(对,右?)
所以,如果我有ThisIsAValue:%v
而我Regex.Replace
,请用字符串Value
替换,我的结果将是ThisIsAValueValue
而不是ThisIsAValue:Value
我已经尝试使用谷歌搜索这个但是“退出角色”在RegEx中如此沉重的事实,所有结果都是针对逃避角色的使用而不是用模式挑选它们。
任何RegEx精明的人都知道我怎么能正确地做到这一点?
答案 0 :(得分:5)
您可以通过捕获并将其包含在替换值中来手动将起始字符放入其中:
Regex.Replace("ThisIsAValue:%v", "([^\\]|^)%v", "$1Value")