0

我想在 VB.NET 中编写一个正则表达式,它接受一个字符串并确定它是否应该被分隔以使其作为 SQL 服务器中的字段名有效。

例如,myField有效(示例上下文:)SELECT myField from myTable,但my field无效并且需要用方括号 ( select [my field] from myTable) 分隔。

正则表达式应匹配包含以下任何内容的字符串:

  • 空白字符
  • 特殊字符(!"£$%^等),不包括_, @,#
  • 以数字开头的字符串或@
  • 任何其他字段命名规则(不包括 sql 保留关键字,单独的函数处理)

我当前的正则表达式模式是[^A-Za-z]+,它可以在匹配任何非字母字符时起作用,但它不必要地匹配诸如my_field或之类的名称field0

首选正则表达式答案,但其他方法也可以

4

2 回答 2

1

在这里,您有一个非基于正则表达式的解决方案。

Dim inputString As String = "my field"
If (fieldIsValid(inputString)) Then
    'Do anything
End If

fieldIsValid函数定义在哪里:

Private Function fieldIsValid(inputString As String) As Boolean
    Dim delimiters() As String = New String() {" ", "!", """", "£", "$", "%", "^"}
    If StringContains(inputString, delimiters) Then
        Return False
    End If

    If (IsNumeric(inputString.Substring(0, 1)) OrElse inputString.Substring(0, 1) = "@") Then 
        Return False
    End If

    Return True

End Function

Private Function StringContains(ByVal inputString As String, ByVal ParamArray delimiters() As String) As Boolean
    For Each delimiter In delimiters
        If inputString.Contains(delimiter) Then
            Return True
        End If
    Next

    Return False
End Function

如您所见,这次与基于正则表达式的解决方案的代码大小差异并不算大;如果您想在将来改进/扩展它,这种解决方案也提供了更大的灵活性。关于“特殊字符”,您必须更具体;即使在使用正则表达式的情况下,您也必须说出您认为的特殊字符。

于 2013-08-22T09:23:02.753 回答
0

此正则表达式符合您的条件:

^([\d@]|.*[^\w@#$]).*$

...和更多!不必指定所有无效字符(其中有 64K),而是使用有效字符的否定。

实际上只有两种类型的问题:

  • 初始字符
  • 剩余的字符

空格不需要特殊检查 - 如果有数千个无效字符,它们只是完成。

因为您想要一个匹配无效内容的正则表达式,所以这两种类型的问题是 ORed。

于 2013-09-16T11:56:52.270 回答