2

我正在努力在 PowerShell 中创建正则表达式。这是从 VS2012 开始的构建后事件以转换 sql,以便我的表名和列名中没有任何空格。一旦这个工作,我可以修改一个脚本,我已经用正则表达式字符串替换文件的内容。我一直在使用本教程,但是当空格位于左方括号和右方括号之间时,我似乎无法用下划线替换空格 (\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))(?=\]),但显然它只选择方括号旁边的空格。我从上面的正则表达式中遗漏了什么?

如果您有任何问题,请告诉我,感谢您的帮助!

4

2 回答 2

3

是的,除非您添加填充,否则它只会选择完全匹配。

也许(?<=\[.*?)(\s(?<=\s))(?=.*?\])已经为您解决了问题。但总的来说,您的正则表达式似乎 A) 过于复杂,并且 B) 正则表达式不是该工作恕我直言的正确工具。

我认为正则表达式一般不会起作用。像这样的字符串怎么样:

[a] [b]

我相信这会变成

[a]_[b]

也许(?<=\[[^\]]*?)(\s(?<=\s))(?=[^\[]*?\])有效,也许无效 - 无论哪种方式都是一团糟!

你真的应该考虑只提取所有\[([^\]]*)\]组,然后用第二步重写这些。

SQL 可能不是常规语言,而是上下文无关的。(参见乔姆斯基层次结构)

于 2013-03-01T23:48:26.020 回答
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

于 2013-03-02T00:04:39.693 回答