2011-04-12 59 views
1

我需要替换文本文件中的数字字符串列表。然而,如果字符串是另一个数字字符串的一部分,它不应该被更换:需要更换 字符串:111111 替换字符串:蒙面Regex.Replace - 跳过属于较长字符串的字符串

Text file: 
111111 
111111.text text 
text text111111 text text 
a111111 
2111111 
111111a 
1111112 
a111111a 

Expected result: 
MASKED 
MASKED.text text 
text textMASKED text text 
aMASKED 
2111111 -> Character 2 prevents masking 
MASKEDa 
1111112 -> Character 2 prevents masking 
aMASKEDa 

这是我的代码:

inputText = Regex.Replace(inputText, "(?<![0-9])" + stringToMask + "(?<![0-9])", "####MASKED####"); 

此代码只是跳过一切,并没有执行任何掩蔽。

+2

应该不是第二个是 - 定向排除(<[0-9]?!)([0-9]?!)? – sh54 2011-04-12 10:10:51

+0

什么sh54说。他应该得分:) – sehe 2011-04-12 10:16:45

+0

@亨克,不,你不能。 '\ D'会是'[^ 0-9]'。 '!'属于断言'(?<!...)'的后面。 – stema 2011-04-12 10:24:15

回答

1

您可以使用MatchEvaluator http://www.dotnetperls.com/regex-replace执行条件替换。要决定瓶坯是否替换,您可以添加第一个和最后一个字母以匹配花样,按此花样分割字符串并分析第一个和最后一个符号。

+0

也添加了Regexp.Escape给你的图案,它可以包含 – varela 2011-04-12 10:22:04

+0

里面的特殊符号我正在研究这个,因为我有兴趣为Replace添加更多的验证。我想要一个预定义的字符串列表,他们的存在将抑制替换操作。例如,在字符串“amount = 111111”中,有'amount ='应该停止匹配。我看了你发布的例子和其他几个人,并不明白它是如何完成的。代表只需要匹配,所以它不能检查之前会发生什么。 – Yoav 2011-04-12 12:16:43

+0

使用Regex.Replace(inputText,“。?”+ stringToMask +“。?”,“#### MASKED ####”);你会在乞讨中得到你需要的一个额外的符号,并在最后。比你可以通过11111分割字符串,第一项将是第一个符号,第二个 - 最后一个。当你完成解析时,你应该把第一个和最后一个符号添加到替换后的字符串中。 – varela 2011-04-12 13:23:38