如何使用正则表达式进行检查?

时间:2016-08-31 10:30:46

标签: regex vb.net

我有一个很长的输入字符串,其中包含某些字段名称。例如:

SELECT some-name, some-name FROM [some-table] WHERE [some-column] = 'some-value'

实际字段名称可能会更改,但始终采用word-word的形式。我需要对字符串执行正则表达式替换,以便输出看起来像这样:

SELECT some - name, some - name FROM [some-table] WHERE [some-column] = 'some - value'

换句话说,当字段名称括在方括号中时,它应保持不变,但如果不是,则应在短划线的任一侧插入空格。没有嵌套的方括号,保留字可以是字符串中的一个或多个。

5 个答案:

答案 0 :(得分:3)

你可以这样做:

Regex.Replace(input, "(?<!\[[^-\]]*)(\w+)-(\w+)(?![^-\]]*\])", "$1 - $2")

以下是对模式的解释:

  • (?<!\[[^-\]]*) - 这是一个消极的后视。它断言匹配不能紧跟在与子模式\[[^-\]]*匹配的文本之后。换句话说,我们要查找的匹配项不能以[字符开头,后跟任意数量的非-]字符。
  • (\w+)-(\w+) - 匹配一个或多个单词字符,然后是短划线,然后是短划线后面的一个或多个单词字符。通过在捕获组中将短划线封闭在短划线的任一侧,我们可以在替换模式中将其值称为$1$2
  • (?![^-\]]*\]) - 这是一个负面的预测。与负面后卫类似,它断言匹配不能立即跟随子模式[^-\]]*\]匹配的文本。换句话说,匹配不能跟不是-]的任意数量的字符,然后是结束]

查看demo

乍一看,您可能会认为您可以简单断言不能紧跟[字符,并且不能紧跟]字符。换句话说,(?<!\[)(\w+)-(\w+)(?!\])。但是,该模式仍会与输入ome-nam中的文字[some-name]匹配,因为文本ome-nam不会立即在括号前面或后面跟着。

答案 1 :(得分:2)

Dim regex As Regex = New Regex("\[[^-]*-[^-]*\]")
Dim match As Match = regex.Match("A long string containing square brackets [some-name]")
If match.Success Then
    Console.WriteLine(match.Value)
End If

或者您可以使用Regex.IsMatch

Return Regex.IsMatch("A long string containing square brackets [some-name]",
                     "\[[^-]*-[^-]*\]")

答案 2 :(得分:1)

只是为了检查它是否存在,你可以尝试

\[[^\]]+-[^\]]+\]

它匹配文字[,然后匹配除]以外的任何字符,最多(包括)连字符。然后是]以外的任何字符,直到文字]

See it here at regex101

答案 3 :(得分:1)

您可以匹配并捕获 [...]子字符串,然后只匹配未用连字符包围的连字符来替换它们:

Dim nStr As String = "SELECT 'some-name' FROM [some-name]"
Dim nResult = Regex.Replace(nStr, "(\[.+?])|\s*-\s*", New MatchEvaluator(Function(m As Match)
                                                   If m.Groups(1).Success Then
                                                       Return m.Groups(1).Value
                                                    Else
                                                        Return " - "
                                                     End If
                                                   End Function))

enter image description here

所以,发生的事情是:

  • (\[[^]]+]) - 在[...]缓冲区内匹配并存储Group(1)子字符串的值(或\[.+?]可用于匹配[,然后1个或多个字符,然后是] - 带有RegexOptions.Singleline标记,以便.也可以匹配换行符。
  • (?<!\s)-(?!\s) - 匹配任何前面带有((?<!\s))或后面((?!\s))的连字符和空格(\s)。实际上,我们甚至可以使用\s*-\s*(其中\s*代表零或更多空格尽可能多,因为*是一个匹配零次或多次出现的贪婪量词在这里删除任何空格,以确保我们只在-之前和之后插入1个空格。

如果第1组匹配,那么我们只需重新插入它(Return m.Groups(1).Value),否则我们插入空格封闭的连字符Return " - "

答案 4 :(得分:1)

其实我不知道vb.net语法,但你可以使用正则表达式

/[\s\'](\w+)\-(\w+)/g

找到(\ w +) - (\ w +)后跟space'并将您的字符串替换为捕获组1st - 2nd

See the sample here