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

时间:2019-07-16 15:41:26

标签: .net regex vb.net

我有一个VB.NET程序,该程序使用RegEx将用户提供的PATTERN和REPLACEMENT参数应用于输入字符串的集合.Replace和REPLACEMENT参数中的特殊字符不会被解释。

有没有办法使RegEx.Replace像在PATTERN字符串中一样解释REPLACEMENT字符串中的特殊字符?例如,将“ \ 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() replacement string in VB.net不同,因为我实际上想要替换字符串中的特殊字符。

它与Regex VB.Net Regex.Replace不同,该问题可以控制替换字符串,并使用VB常量而不是RegEx特殊字符来规避我的问题。

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

2 个答案:

答案 0 :(得分:2)

  

有没有办法使RegEx.Replace像在PATTERN字符串中一样解释REPLACEMENT字符串中的特殊字符?例如,将“ \ t”视为选项卡,将“ \ xAE”或“ \ u00AE”视为(R)?

您是说像Regex.Unescape(String) Method吗?

如果您可以接受Remarks Section中声明的限制:

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

Regex.Unescape("\xAE\t\u00AE")产生字符串结果“®”,vbTab和“®”

答案 1 :(得分:1)

VB.Net没有转义符。

根据Replace方法的docs

  

Substitutions是唯一的正则表达式语言元素   以替换模式识别。所有其他正则表达式   常规允许使用语言元素(包括字符转义符)   仅表示模式,不能在替换中识别   模式。

相当于两行代码的是:

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名称空间,请确保导入。