程序里经常会对字符串进行操作,有时候要对字符串进行特殊处理或是用简短高效的代码处理,就会用到正则表达式。
例子:比如把界面中的数据登录到数据库中,这时候就要判断输入的字符串是否合法,不然登录输入的字符串(如引号)就会报错。下面的代码中就是在VB.NET中用正则表达式来判断Email,URL,IP,自定义特殊字符的检查与否。
Imports System.Text.RegularExpressions
Public Class frmRegular
Private Const C_REGULAR_EMAIL = "^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$" ‘\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
Private Const C_REGULAR_URL = "[a-zA-z]+://[^\s]*" ‘
Private Const C_REGULAR_IP = "\b((25[0-5]|2[0-4]\d|[01]\d\d|\d?\d)\.){3}(25[0-5]|2[0-4]\d|[01]\d\d|\d?\d)\b"
Private Sub btnCheck_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCheck.Click
If txtRegular.Text.Trim.Length = 0 Then Exit Sub
Dim strPattern As String = String.Empty
Dim strCheckedText As String = String.Empty
If rdoEmail.Checked Then
strPattern = C_REGULAR_EMAIL
strCheckedText = rdoEmail.Text
ElseIf rdoURL.Checked Then
strPattern = C_REGULAR_URL
strCheckedText = rdoURL.Text
ElseIf rdoIP.Checked Then
strPattern = C_REGULAR_IP
strCheckedText = rdoIP.Text
End If
If funCheckRegular(strPattern) Then
MsgBox(strCheckedText + ": It’s Right", MsgBoxStyle.Information, Me.Text)
Else
MsgBox(strCheckedText + ": Wrong!!!", MsgBoxStyle.Exclamation, Me.Text)
End If
End Sub
Private Function funCheckRegular(ByVal strPattern As String)
Return Regex.IsMatch(txtRegular.Text.Trim, strPattern)
End Function
‘自定义要检查的字符
Private Sub subCustomSpecialCheck()
‘Insert SQL文中的特殊字符:引号(‘)或反斜杠(\)
Dim strPatternSearchVal As String = "’|\\"
Dim strInput As String = "The cat saw the other cats playing in the back yard.INSERT ‘OK?"
Dim match As Match = Regex.Match(strInput, strPatternSearchVal)
If match.Success = True Then
MsgBox("含有特殊文字【" + match.Value + "】。", MsgBoxStyle.Exclamation, Me.Text)
Else
MsgBox("没有特殊文字。", MsgBoxStyle.Information, Me.Text)
End If
End Sub
Private Sub btnClear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClear.Click
txtRegular.Text = String.Empty
End Sub
End Class
————————————————————————————————–
http://www.regexplib.com
正则表达式工具:
1:RegexBuddy
2:RegEx-TestBed
Category Archives: Microsoft .NET
VB.NET 正则表达式应用(简单实例)
VB.NET 同一Form中多语言切换并读取资源文件
执行效果↓(下拉列表中选择英文,日文,中文即时改变(不重启)。不是New一个Form,用ComponentResourceManager在同一Form中切换。)
———————————————————————————————————————————————————–
下面介绍下多语言在同一Form中的切换,以及读取[系统生成的资源文件]和[自定义资源文件]。先建立一个VB的Windows Application工程,在工程里建一个Form(FrmMain),在Form中建一个Lable(LabLanguageName);然后建4个自定义的资源文件(Resource_Common.resx,Resource_en-US.resx,Resource_ja-JP.resx,Resource_zh-Cn.resx),工程目录结构如下图:
工程Form↓ 工程目录↓
一、建好工程以后,是不会生成像上图的多语言文件的(FrmMain.en-US.resx,FrmMain.ja-JP.resx,FrmMain.zh-CN.resx),怎么生成的呢?
1:选中Form,设定Language=[本地化语言],和Localizable=[True]。(这样还不能生成如上文件,请看下一步)
2:选中Form中的Lable,Text设成[中文],保存。这样就生成了文件了(FrmMain.zh-CN.resx)。
双击打开FrmMain.zh-CN.resx →
二、对[系统生成的资源文件]和[自定义资源文件]读取
Imports System.Resources
Public Const CNT_RESOURCE_EN As String = "MultilingualApp.Resource_en-US"
Public Const CNT_RESOURCE_JP As String = "MultilingualApp.Resource_ja-JP"
Public Const CNT_RESOURCE_CN As String = "MultilingualApp.Resource_zh-CN"
Public Const CNT_RESOURCE_COMMON As String = "MultilingualApp.Resource_Common"
Public Function GetCurrentResourcesMessage(Optional ByVal strResourceFile As String = "")
‘读取上图的①:系统生成的资源文件
‘Dim rm As New ResourceManager("MultilingualApp.Resources", Me.GetType().Assembly)
‘读取上图的②:自定义的资源文件
Dim rm As Resources.ResourceManager = Nothing
If strResourceFile = String.Empty Then
rm = New Resources.ResourceManager(CNT_RESOURCE_COMMON, Reflection.Assembly.GetExecutingAssembly())
ElseIf Not strResourceFile = String.Empty Then
rm = New Resources.ResourceManager(strResourceFile, Reflection.Assembly.GetExecutingAssembly())
Else
‘Nothing
End If
Return rm
End Function
代码太长就不贴出来了,还是自己下载整个工程的代码吧:MultilingualApp.rar
VB.NET 修改注册表(例:IE项)
Imports Microsoft.Win32
‘Zones 项包含表示为计算机定义的每个安全区域的项。
”1 本地 Intranet 区域
”2 受信任的站点区域
”3 Internet 区域
”4 受限制的站点区域
Public regPath As String = "Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3\"
Public regFileDownd As String = "1803"‘文件下载
Public regFileDowndPrompt As String = "2200"‘文件下载自动提示
Private Sub btnSetIE_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSetIE.Click
Dim strFileDowndVal As String
Dim strFileDowndPromptVal As String
‘取得原本IE中的【文件下载】,【文件下载自动提示】值
strFileDowndVal = funGetRegeditValue(regPath, regFileDownd)
strFileDowndPromptVal = funGetRegeditValue(regPath, regFileDowndPrompt)
‘将【文件下载】,【文件下载自动提示】值生成有效(0)
Call subSetNewIEDownloadProperty()
‘还原原本IE中的【文件下载】,【文件下载自动提示】值
Call subSetOriginalIEDownloadProperty(strFileDowndVal, strFileDowndPromptVal)
End Sub
‘取注册表项的值
Public Function funGetRegeditValue(ByVal regPath As String, ByVal regName As String)
Dim reg As RegistryKey
Dim strReturn As String = String.Empty
reg = Registry.CurrentUser
reg = reg.OpenSubKey(regPath, True)
strReturn = reg.GetValue(regName)
funGetRegeditValue = strReturn
End Function
‘设置注册表项的值
Public Sub subSetRegeditValue(ByVal regPath As String, ByVal regName As String, ByVal regValue As String)
Dim reg As RegistryKey
reg = Registry.CurrentUser
reg = reg.OpenSubKey(regPath, True)
‘每个DWORD值等于0、1或3。通常,设置为0则将具体操作设置为允许;设置为 1则导致出现提示;设置为 3则禁止执行具体操作
reg.SetValue(regName, regValue, RegistryValueKind.DWord)
End Sub
‘设定【文件下载】,【文件下载自动提示】为有效
Public Sub subSetNewIEDownloadProperty()
Call subSetRegeditValue(regPath, regFileDownd, "0")
Call subSetRegeditValue(regPath, regFileDowndPrompt, "0")
End Sub
‘还原IE最初设定值
Public Sub subSetOriginalIEDownloadProperty(ByVal OriginalFileDowndVal As String, ByVal OriginalFileDowndPromptVal As String)
Dim strFileDownd As String
Dim strFileDowndPrompt As String
strFileDownd = funGetRegeditValue(regPath, regFileDownd)
strFileDowndPrompt = funGetRegeditValue(regPath, regFileDowndPrompt)
If Not OriginalFileDowndVal.Equals(strFileDownd) Then
Call subSetRegeditValue(regPath, regFileDownd, OriginalFileDowndVal)
End If
If Not OriginalFileDowndPromptVal.Equals(strFileDowndPrompt) Then
Call subSetRegeditValue(regPath, regFileDowndPrompt, OriginalFileDowndPromptVal)
End If
End Sub
在DataGridView中第一时间获得CheckBox的值
在DataGridView中的CheckBox点下后往往不能第一时间取得CheckBox值,或在其他事件中要移开后才能取得CheckBox值。下面方法可以在点下CheckBox后直接获得CheckBox的正确值。
Private Sub DataGridView_CurrentCellDirtyStateChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles DataGridView.CurrentCellDirtyStateChanged
‘将当前单元格中的更改提交到数据缓存,但不结束编辑模式
DataGridView.CommitEdit(DataGridViewDataErrorContexts.CurrentCellChange)
‘当前列
Dim intCurrentCol As Integer = DataGridView.CurrentCell.ColumnIndex
‘第一列
If intCurrentCol = 0 Then
‘打钩背景为绿色,不打钩背景为黄色
If DataGridView.Rows.Item(DataGridView.CurrentRow.Index).Cells(intCurrentCol).Value = True Then
DataGridView.BackgroundColor = Color.Blue
Else
DataGridView.BackgroundColor = Color.Yellow
End If
End If
VB.NET 通常用法使用笔记
● ‘解决直接对DataTable排序无效的问题
‘例如:要对dtOrderData进行排序,直接用.DefaultView.Sort的话排序是无效的。
‘无效用法
dtOrderData.DefaultView.Sort = "ID_ORD Asc"
‘有效用法
Dim dvSort As New DataView
dvSort = dtOrderData.DefaultView
dvSort.Sort = "ID_ORD Asc"
dtOrderData = dvSort.ToTable
● ‘
Dim strFilter As String
Dim strSearchVal As String = "查询值"
strFilter = "字段名 = ‘" + strSearchVal + "’"
‘克隆 dtInfo (DataTable) 的结构
Dim dtFilterTable As DataTable = dtInfo.Clone
‘将[字段名]为‘查询值‘的数据都筛选出来
For Each foundRows As DataRow In dtInfo.Select(strFilter)
dtFilterTable.ImportRow(foundRows)
Next
● ‘在DataTable中取唯一值;相当于SQL文的DISTINCT效果
Dim dtFilterDistinct As New DataTable
dtFilterDistinct = dtInfo.DefaultView.ToTable(True, New String() {"ID", "NAME"})
● ‘合并单元格,居中
xlSheet.Cells.Range("B1:C1").Merge()
xlSheet.Cells.Range("B1").Columns.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter
● ‘补粗线框
xlSheet.Range("A1:E1").BorderAround(, Excel.XlBorderWeight.xlMedium)
● ‘画细线框(详细)
With xlApp.ActiveSheet.Range("A1:E1").Borders(Excel.XlBordersIndex.xlEdgeTop)
.LineStyle = Excel.XlLineStyle.xlContinuous
.Weight = Excel.XlBorderWeight.xlThin ‘xlMedium
.ColorIndex = Excel.XlColorIndex.xlColorIndexAutomatic ‘xlAutomatic
End With
● ‘增加一行
xlSheet.Rows("10:10").Insert(Shift:=Excel.XlDirection.xlDown)
● ‘删除有数据的最后一行
xlSheet.Rows(xlSheet.UsedRange.Rows.Count).Delete()
● ‘加快写Excel数据速度:自动重新计算工作表(写数据前关)
xlSheet.EnableCalculation = False
‘加快写Excel数据速度:自动重新计算工作表(保存数据前开)
xlSheet.EnableCalculation = True ● ”’ <summary>
”’ 将数字列转换为字母
”’ </summary>
”’ <param name="inCol">传入列数</param>
”’ <returns>返回传入列数的所在列字母</returns>
Function GetNoToAbcCol(ByVal intCol As Integer) As String
intCol –= 1
Dim chars As New List(Of String)
Do
If (chars.Count > 0) Then
intCol –= 1
End If
chars.Insert(0, Chr(intCol Mod 26 + Asc("A")))
intCol = intCol \ 26
Loop While intCol > 0
Return String.Join(String.Empty, chars.ToArray)
End Function ● ”’ <summary>
”’将字母列转换为数字
”’ </summary>
”’ <param name="strRangeCol">传入字母列</param>
”’ <returns>返回传入字母列的所在列数字</returns>
Function GetAbcToNoCol(ByVal strRangeCol As String) As Integer
Dim returnVal As Integer = –1
strRangeCol = UCase(strRangeCol)
If strRangeCol.Length = 1 Then
returnVal = Asc(strRangeCol) Mod 64
Return returnVal
ElseIf strRangeCol.Length = 2 Then
returnVal = (Asc(Left(strRangeCol, 1)) Mod 64) * 26 _
+ Asc(Right(strRangeCol, 1)) Mod 64
Return returnVal
Else
End If
End Function
● ”’ <summary>
”’以星期天为界,算每个月有几周,从几号到几号。
”’ </summary>
”’ <param name="dateCurrentYMD">当前月</param>
”’ <returns></returns>
Private Sub subWriteWeekTitle(ByVal dateCurrentYMD As Date)
Dim arrMonth As New ArrayList
Dim strStart As String = String.Empty
Dim strEnd As String = String.Empty
Dim y As Integer
Dim m As Integer
Dim iDays As Integer
Dim FirstDayOfMonth As Date
Dim FirstDayOfWeek As Date
Dim iWeeks As Integer = 1
y = CInt(Format(dateCurrentYMD, "yyyy"))
m = CInt(Format(dateCurrentYMD, "MM"))
iDays = Date.DaysInMonth(y, m)
FirstDayOfMonth = Date.Parse(CStr(y) + "-" + CStr(m) + "-1")
FirstDayOfWeek = FirstDayOfMonth
‘本月的场合
While (FirstDayOfWeek.Month = m)
Dim LastDayOfWeek As Date
strStart = "第" + CStr(iWeeks) + "周:" + getFormatM(FirstDayOfWeek) + "-"
If (FirstDayOfWeek.Day + 7 > iDays) Then
LastDayOfWeek = FirstDayOfWeek.AddDays(iDays – FirstDayOfWeek.Day)
‘Debug.Print(LastDayOfWeek.ToString("MM/dd"))
strEnd = LastDayOfWeek.ToString("dd")
arrMonth.Add(strStart + strEnd)
Exit While
Else
LastDayOfWeek = FirstDayOfWeek
End If
‘循环一周天
For iPlus As Integer = 1 To 7
‘以星期天为界
If LastDayOfWeek.DayOfWeek = DayOfWeek.Sunday And LastDayOfWeek.Month = m Then
‘Debug.Print(LastDayOfWeek.ToString("MM/dd"))
strEnd = LastDayOfWeek.ToString("dd")
Exit For
ElseIf LastDayOfWeek.Month = m + 1 Then
LastDayOfWeek = LastDayOfWeek.AddDays(-1)
‘Debug.Print(LastDayOfWeek.ToString("MM/dd"))
strEnd = LastDayOfWeek.ToString("dd")
Exit For
End If
LastDayOfWeek = LastDayOfWeek.AddDays(1)
Next
iWeeks += 1
FirstDayOfWeek = LastDayOfWeek.AddDays(1)
arrMonth.Add(strStart + strEnd)
End While
For iWeek As Integer = 0 To arrMonth.Count – 1
Debug.Print(arrMonth.Item(iWeek))
Next
End Sub