【问题标题】:Regex.Replace - skip strings which are part of a longer stringRegex.Replace - 跳过作为较长字符串一部分的字符串
【发布时间】:2011-04-12 10:07:09
【问题描述】:

我需要替换文本文件中的数字字符串列表。但是,如果字符串是另一个数字字符串的一部分,则不应替换它: 要替换的字符串:111111 替换字符串:MASKED

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####");

此代码只是跳过所有内容,不执行任何屏蔽。

【问题讨论】:

  • 第二个 (?
  • sh54 所说的。他应得的标记:)
  • @Henk,不,你不能。 \D 将是 [^0-9]! 属于断言 (?&lt;! ...) 背后的样子。
  • sh54 - 这行得通。如果您创建它,我很乐意选择您的答案。

标签: c# regex replace


【解决方案1】:

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

【讨论】:

  • 还添加Regexp.Escape到你的模式,它可以在里面包含特殊符号
  • 我正在研究这个,因为我有兴趣为 Replace 添加更多验证。我想要一个预定义字符串的列表,这些字符串的存在会抑制替换操作。例如,在字符串“amount=111111”中,有 'amount=' 应该会停止匹配。我查看了您发布的示例和其他一些示例,但不明白如何完成。代理只接受匹配,因此它无法检查它之前的内容。
  • 使用 Regex.Replace(inputText, ".?" + stringToMask + ".?", "####MASKED####");您将在乞讨和最后获得所需的匹配,并带有 1 个额外的符号。比你可以用 11111 分割字符串,第一个项目将是第一个符号,第二个 - 最后一个。当你完成解析时,你应该将第一个和最后一个符号添加到替换的字符串中。
  • 谢谢。不幸的是,这意味着我不能将它用于我上面解释的目的。
【解决方案2】:

如果我正确理解您的问题,以下正则表达式应该可以工作:

(?<!\d)111111(?!\d)

它同时使用negative lookbehind assertion and a negative lookahead assertion

这里是a working example

输出:

MASKED
 MASKED.text text
text textMASKED text text
aMASKED
2111111
MASKEDa
1111112
aMASKEDa

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多