VB.NET字符串转义详细概念解析
创始人
2024-06-20 01:01:48
0

虽然说VB.NET中有很多东西是其他语言没有的,但是同时其他语言具有的一些特点,这款编程语言也是不具备的。不过我们可以通过其他的方式来实现。比如,众所周知,VB中没有C#的字符串转义语法。#t#

C#中可以写

 

  1. string s = "This is a 
    string with newline.\n"

而VB.NET字符串转义的只能写

  1. Dim s = "This is a string 
    with newline."
     & vbLf 

人们渴望一个和C#中的"@"字符串正好相反的语法:

 

  1. string s = @"This is a string 
    with '\n' literal.\n";Dim s = 
    @"This is a string with newline.\n" 

但是,这种VB.NET字符串转义语法还没有被加入。

 

于是,我通过使用扩展函数,实现了比较接近的语法。

  1. Dim s = "This is a string 
    with newline.\n".Descape 

另外,还对String.Format进行了类似处理

 

  1. Dim s2 = "This is a 
    string that is {0}".
    Formats("formated.") 

 

VB.NET字符串转义的具体实现如下:

  1. '  
  2. ' File: StringDescape.vb  
  3. ' Description: VB.Net字符串转义语法糖 
    < Visual Basic 9> 
  4. ' Version: 2008.09.28.  
  5. ' (cc) F.R.C. 按照 Creative 
    Commons Public Domain Dedication L
    icense 捐献  
  6. ' http://creativecommons.org/
    licenses/publicdomain/  

 

  1. Imports System  
  2. Imports System.Collections.Generic  
  3. Imports System.Text  
  4. Imports System.Text.RegularExpressions  
  5. Imports System.Runtime.CompilerServices  
  6. Imports Microsoft.VisualBasic 

 

 

  1. /**/''' < summary>字符串转义< /summary> 
  2. Public Module StringDescapeModule StringDescape  
  3. /**/''' < summary>字符串反转义函数< /summary> 
  4. ''' < remarks> 
  5. ''' \0 与null \u0000 匹配  
  6. ''' \a 与响铃(警报)\u0007 匹配   
  7. ''' \b 与退格符 \u0008 匹配  
  8. ''' \t 与 Tab 符 \u0009 匹配   
  9. ''' \r 与回车符 \u000D 匹配  
  10. ''' \v 与垂直 Tab 符 \u000B 匹配  
  11. ''' \f 与换页符 \u000C 匹配  
  12. ''' \n 与换行符 \u000A 匹配  
  13. ''' \e 与 Esc 符 \u001B 匹配  
  14. ''' \x?? 与 \u00?? 匹配  
  15. ''' \u???? 与对应的Unicode字符对应  
  16. ''' < /remarks> 
  17. < Extension()> Public Function Descape
    ()Function Descape(ByVal This As 
    String) As String  
  18. Dim m = r.Match(This)  
  19. If Not m.Success Then Throw New 
    InvalidCastException 

 

 

  1. Dim ss As New SortedList(Of
     Integer, String)  
  2. For Each c As Capture In m.Groups.
    Item("SingleEscape").Captures  
  3. ss.Add(c.Index, SingleEscapeDict
    (c.Value))  
  4. Next  
  5. For Each c As Capture In m.Groups.
    Item("UnicodeEscape").Captures  
  6. ss.Add(c.Index, ChrW(CInt("&H" 
    & c.Value)))  
  7. Next  
  8. For Each c As Capture In m.Groups.
    Item("ErrorEscape").Captures  
  9. Throw New ArgumentException("
    ErrorEscape: Ch " & (c.Index + 1) 
    & " " & c.Value)  
  10. Next  
  11. For Each c As Capture In m.Groups.
    Item("Normal").Captures  
  12. ss.Add(c.Index, c.Value)  
  13. Next  
  14. Dim sb As New StringBuilder  
  15. For Each s In ss.Values  
  16. sb.Append(s)  
  17. Next  
  18. Return sb.ToString  
  19. End Function 

 

 

  1. /**/''' < summary>将指定的 String 
    中的格式项替换为指定的 Object 实例的值
    的文本等效项。< /summary> 
  2. < Extension()> Public Function Formats
    ()Function Formats(ByVal This As String, 
    ByVal arg0 As Object) As String  
  3. Return String.Format(This, arg0)  
  4. End Function  
  5. /**/''' < summary>将指定的 String 
    中的格式项替换为两个指定的 Object 实例的
    值的文本等效项。< /summary> 
  6. < Extension()> Public Function Formats
    ()Function Formats(ByVal This As String,
     ByVal arg0 As Object, ByVal arg1 As
     Object) As String  
  7. Return String.Format(This, arg0, arg1)  
  8. End Function  
  9. /**/''' < summary>将指定的 String 中的
    格式项替换为三个指定的 Object 实例的值的文本
    等效项。< /summary> 
  10. < Extension()> Public Function Formats
    ()Function Formats(ByVal This As String, 
    ByVal arg0 As Object, ByVal arg1 As Object, 
    ByVal arg2 As Object) As String  
  11. Return String.Format(This, arg0, arg1, arg2)  
  12. End Function  
  13. /**/''' < summary>将指定 String 中的格式
    项替换为指定数组中相应 Object 实例的值的文
    本等效项。< /summary> 
  14. < Extension()> Public Function Formats()
    Function Formats(ByVal This As String, 
    ByVal ParamArray args As Object()) As String  
  15. Return String.Format(This, args)  
  16. End Function  
  17. /**/''' < summary>将指定 String 中的格式项
    替换为指定数组中相应 Object 实例的值的文本等效项。
    指定的参数提供区域性特定的格式设置信息。< /summary> 
  18. < Extension()> Public Function Formats()Function 
    Formats(ByVal This As String, ByVal provider 
    As IFormatProvider, ByVal ParamArray args 
    As Object()) As String  
  19. Return String.Format(provider, This, args)  
  20. End Function 

  1. Private ReadOnly Property SingleEscapeDict()
    Property SingleEscapeDict() As Dictionary
    (Of String, String)  
  2. Get  
  3. Static d As Dictionary(Of String, String)  
  4. If d IsNot Nothing Then Return d  
  5. d = New Dictionary(Of String, String)  
  6. d.Add("\", "\") 'backslash  
  7. d.Add("0", ChrW(0)) 'null  
  8. d.Add("a", ChrW(7)) 'alert (beep)  
  9. d.Add("b", ChrW(8)) 'backspace  
  10. d.Add("f", ChrW(&HC)) 'form feed  
  11. d.Add("n", ChrW(&HA)) 'newline (lf)  
  12. d.Add("r", ChrW(&HD)) 'carriage return (cr)   
  13. d.Add("t", ChrW(9)) 'horizontal tab   
  14. d.Add("v", ChrW(&HB)) 'vertical tab  
  15. Return d  
  16. End Get  
  17. End Property  
  18. Private ReadOnly Property SingleEscapes
    ()Property SingleEscapes() As String  
  19. Get  
  20. Static s As String  
  21. If s IsNot Nothing Then Return s  
  22. Dim Chars As New List(Of String)  
  23. For Each c In "\0abfnrtv"  
  24. Chars.Add(Regex.Escape(c))  
  25. Next  
  26. s = "\\(?< SingleEscape>" & String.
    Join("|", Chars.ToArray) & ")"  
  27. Return s  
  28. End Get  
  29. End Property  
  30. Private UnicodeEscapes As String = 
    "\\[uU](?< UnicodeEscape>[0-9A-Fa-f]{4})
    |\\x(?< UnicodeEscape>[0-9A-Fa-f]{2})" 
  31. Private ErrorEscapes As String = 
    "(?< ErrorEscape>\\)" 
  32. Private Normal As String = "(?< Normal>.)" 
  33. Private r As New Regex("^" & "(
    " & SingleEscapes & "|" & Unicode
    Escapes & "|" & ErrorEscapes & "|" & 
    Normal & ")*" & "$", RegexOptions.
    ExplicitCapture)  
  34. End Module 

希望大家可以理解VB.NET字符串转义这段代码编写方法。

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...