有没有办法让 VB.NET RegEx.Replace 在 REPLACE 参数中使用特殊字符?



我有一个程序 VB.NET 程序,该程序使用正则表达式将用户提供的 PATTERN 和 REPLACE 参数应用于输入字符串的集合。

有没有办法让RegEx.Replace 像在 PATTERN 字符串中那样解释 REPLACE 字符串中的特殊字符?例如,将"\t"视为制表符,将"\xAE"或"\u00AE"视为 (R)?

在 Linux 中,我从 sed 获得正确的输出

echo Test XXX Replacement | sed 's/XXX/xAE/'

给出"测试®替换">

但是在 VB 中,它只是给了我特殊的字符模式作为文字

Regex.Replace("Test XXX Replacement", "XXX", "t")
Regex.Replace("Test XXX Replacement", "XXX", "u00AE")

分别给出"测试 \t 替换"和"测试 \u00AE 替换">

我发现了 2 个有点相关但明显不适用的帖子,我的问题与 Escape Regex.replace() 替换字符串不同,VB.net 因为我实际上想要替换字符串中的特殊字符。

它也不同于正则表达式 VB.Net 正则表达式.Replace,该问题控制了替换字符串,并通过使用 VB 常量而不是正则表达式特殊字符来回避我的问题。

是否有任何设置/选项/实用程序/方法可以使我的(用户提供!正则表达式替换字符串正确处理特殊字符?

没有办法让RegEx.Replace 像在 PATTERN 字符串中那样解释 REPLACE 字符串中的特殊字符?例如,将"\t"视为制表符,将"\xAE"或"\u00AE"视为 (R)?

你的意思是像Regex.Unescape(String)方法?

如果您可以接受"备注"部分中声明的限制:

  • 它通过从 Escape 方法转义的每个字符中删除转义字符 ("\") 来反转由该方法执行的转换。其中包括 \、*、+、?、|、{、[、(,)、^、$、.、# 和空格字符。此外,Unescape 方法取消转义右方括号 (]) 和右大括号 (}) 字符。
  • 它将逐字字符串文本中的十六进制值替换为实际的可打印字符。例如,它将 @"\x07" 替换为"\a",或将 @"\x0A" 替换为""。它转换为支持的转义字符,如 \a、\b、\e、、\r、\f、\t、\v 和字母数字字符。

Regex.Unescape("xAEtu00AE")生成 "®" &vbTab & "®" 的字符串结果

VB.Net 没有转义字符。

根据Replace方法的文档:

替换是唯一的正则表达式语言元素 在替换模式中识别。所有其他正则表达式 常规语言元素(包括字符转义)是允许的 仅表达模式,在替换时无法识别 模式。

相当于您的两行代码将是:

Regex.Replace("Test XXX Replacement", "XXX", vbTab)
Regex.Replace("Test XXX Replacement", "XXX", ChrW(&H00AE))

如果需要在较长的替换字符串中嵌入十六进制字符串或字符,也可以对替换字符串使用字符串内插:

Regex.Replace("Test XXX Replacement", "XXX", $"{vbTab} yyy {ChrW(&H00AE)}")

如果尚未导入Microsoft.VisualBasic命名空间,请确保导入。