【问题标题】:Regex to replace numbers in a string with numbered placeholders正则表达式用带编号的占位符替换字符串中的数字
【发布时间】:2022-01-09 13:39:21
【问题描述】:

我有一个正则表达式可以用值@p 替换字符串中的数字,但我想用相同的@p1 替换相同的数字,然后用@p2 和@p3 等等。

这是示例字符串

23 44 56 83 23 83 103 6573 56

我当前的简单替换会返回这个

@p @p @p @p @p @p @p @p @p

我想要的是这个

@p1 @p2 @p3 @p4 @p1 @p4 @p5 @p6 @p3

所以相同的数字将返回相同的@p 数字。

我的正则表达式匹配字符串是这个 @"\b[0123456789]+\b"

所以目前我正在这样做

public static System.Text.RegularExpressions.Regex Reg_pass_numbers = new 
System.Text.RegularExpressions.Regex(@"\b[0123456789]+\b");
StringHolder = Reg_pass_Hex.Replace(StringHolder, "@p");

StringHolder 保存我的输入字符串。

正则表达式可以帮助解决这个问题吗?

【问题讨论】:

  • 看来您需要指定一个匹配评估器。
  • 嗨,所以我可以保留一个匹配数组及其索引,然后在匹配评估器中使用索引。是这个意思吗?
  • 不是数组,字典会更好

标签: c# regex string replace


【解决方案1】:

同意骆驼。 MatchEvaluator 是一段代码,用于指定在 Regex 替换期间应使用什么值进行替换

var r = new Regex(@"\d+");
var i = "23 32 23";
var d = new Dictionary<string, int>();
var x = 1;
var o = r.Replace(
  i,
  m => d.TryGetValue(m.Value, out var v)? $"@p{v}" : $"p{d[m.Value]=x++}"
);
  

这里有一点要取消的,所以..

  • 您的正则表达式可以简化为“一位或多位数字”。
  • 我们有一个变量 x,每次我们找到一个我们以前从未见过的新匹配时,我们都会增加它
  • 我们有一本字典,可以跟踪我们看到的匹配项
  • 匹配评估代码获取匹配值,例如 m.Value 中的“23”
  • 我们尝试将字典值放入 v;如果成功,我们使用 v。如果不成功,我们为 m.Value 添加一个新的字典条目,其当前值为 x,然后递增 x

如果你想从中做一些sql参数并且想知道什么值和什么参数一起,枚举整个字典:键值对的Value是p数,Key是值字符串

【讨论】:

  • 谢谢,我已经实施了您的解决方案,并且效果很好。我确实简化了正则表达式,但只是一点点。我用 @"\b\d+\b" 。原因是我需要边界,所以我不想在这个“fred123”中匹配 123。再次感谢您
【解决方案2】:

您可以使用Regex.Replace,但在替换时您可以借助字典检查match是否出现在较早之前:

// try adding a new match
dict.TryAdd(m.Value, dict.Count + 1) 
  ? dict.Count    // succeed, just return its number
  : dict[m.Value] // failed to add, the match already exists, take its number

代码:

string source = "23 44 56 83 23 83 103 6573 56";

Dictionary<string, int> dict = new Dictionary<string, int>();

string result = Regex.Replace(
  source, 
 "[0-9]+", 
  m => $"@p{(dict.TryAdd(m.Value, dict.Count + 1) ? dict.Count : dict[m.Value])}");

【讨论】:

    猜你喜欢
    • 2012-04-26
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 2018-07-13
    相关资源
    最近更新 更多