我有一个很长的输入字符串,其中包含某些字段名称。例如:
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'
换句话说,当字段名称括在方括号中时,它应保持不变,但如果不是,则应在短划线的任一侧插入空格。没有嵌套的方括号,保留字可以是字符串中的一个或多个。
答案 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)
只是为了检查它是否存在,你可以尝试
\[[^\]]+-[^\]]+\]
它匹配文字[
,然后匹配除]
以外的任何字符,最多(包括)连字符。然后是]
以外的任何字符,直到文字]
。
答案 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))
所以,发生的事情是:
(\[[^]]+])
- 在[...]
缓冲区内匹配并存储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