方括号内的字符的正则表达式

时间:2013-03-01 23:45:32

标签: regex powershell visual-studio-2012

我正致力于在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))(?=\]),但显然它只选择方括号紧邻它的空格。我在上面的正则表达式中遗漏了什么?

如果您有任何问题,请与我们联系,谢谢您的帮助!

2 个答案:

答案 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