我正致力于在PowerShell中创建正则表达式。这是VS2012的postbuild事件开始转换sql,这样我的表名和列名就不会有任何空格。一旦这个工作,我可以修改我已经拥有的脚本用正则表达式字符串替换文件的内容。我一直在使用this tutorial,但当空格位于打开和关闭的方括号之间时,我似乎无法用下划线替换空格(\ s)。
以下是我如何转换sql的示例:
转换:
select * from [Existing product] where [Existing product].[Desc value] = 26
要:
select * from [Existing_product] where [Existing_product].[Desc_value] = 26
当我在powershell ISE中运行此脚本时:
#Example of PowerShell Regex Replace
$newline = '
'
$strText = 'select * from [Existing product] where [Existing product].[Desc value] = 26'
$Pattern = '(?<=\[)(\s(?<=\s))(?=\])'
$New = "_"
$newline
'SourceText: '
$strText
$newline
$strReplace = [regex]::replace($strText, $pattern, "$New")
"We will now replace $Pattern with $New :"
$newline
$strReplace
我得到了这个结果:
PS C:\> C:\REGEX.ps1
SourceText:
select * from [Existing product] where [Existing product].[Description value] = 26
We will now replace (?<=\[)(\s(?<=\s))(?=\]) with _ :
select * from [Existing product] where [Existing product].[Description value] = 26
我希望看到上面用下划线替换空格的字符串。
我的正则表达式目前是(?<=\[)(\s(?<=\s))(?=\])
,但显然它只选择方括号紧邻它的空格。我在上面的正则表达式中遗漏了什么?
如果您有任何问题,请与我们联系,谢谢您的帮助!
答案 0 :(得分:3)
是的,除非你添加填充,否则它只会选择完全匹配。
也许(?<=\[.*?)(\s(?<=\s))(?=.*?\])
已经为你做了伎俩。但总的来说,你的正则表达式似乎A)过于复杂,而且B)正则表达式不适合这个职位恕我直言。
我认为正则表达式不会起作用。这样的字符串怎么样:
[a] [b]
我相信这会变成
[a]_[b]
也许(?<=\[[^\]]*?)(\s(?<=\s))(?=[^\[]*?\])
有效,也许不行 - 无论如何都是一团糟!
你真的应该考虑只提取所有\[([^\]]*)\]
组,然后第二步重写这些组。
SQL可能不是常规语言,而是上下文无关。 (见乔姆斯基等级)
答案 1 :(得分:2)
这似乎有效:
$string = 'select * from [Existing product] where [Existing product].[Desc value] = 26'
$string -replace '(\[\S+)\s(\S+\])','$1_$2'
从[Existing_product]中选择* [Existing_product]。[Desc_value] = 26
如果有多个嵌入空间,则会变得更复杂。
$string = 'select * from [Existing product one] where [Existing product one].[Desc value] = 26'
[regex]$regex = '(\[[^\]]*\])'
$regex.Matches($string) |
%{$string = $string -replace [regex]::escape($_.value),($_.value.replace(' ','_'))}
$string
从[Existing_product_one]中选择* [Existing_product_one]。[Desc_value] = 26