2013-03-01 3 views
2

Я работаю над созданием регулярного выражения в PowerShell. Это начало события postbuild из VS2012 для преобразования sql, так что имена таблиц и имена столбцов в них не имеют пробелов. Как только это сработает, я могу изменить скрипт, который я уже должен заменить содержимым файла с помощью строки регулярного выражения. Я работал с this tutorial, но я не могу заменить пространство (\ s) знаком подчеркивания, когда это пространство находится между открытой и закрытой квадратной скобкой.Регулярное выражение для символов внутри квадратных скобок

Вот пример того, как я хотел бы преобразовать SQL:

Convert:

select * from [Existing product] where [Existing product].[Desc value] = 26 

To:

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 

I получите этот результат:

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))(?=\]), но, по-видимому, оно выделяет только места, где квадратная скобка находится рядом с ней. Что мне не хватает в regex выше?

Пожалуйста, дайте мне знать, если у вас есть вопросы и спасибо за помощь!

ответ

3

Да, если вы не добавили в дополнение, он будет выбирать только точные соответствия.

Возможно, (?<=\[.*?)(\s(?<=\s))(?=.*?\]) уже делает трюк для вас. Но в общем случае ваше регулярное выражение кажется A) чрезмерно сложным, и B) регулярные выражения не являются правильным инструментом для этой работы IMHO.

Я не думаю, что регулярное выражение будет работать в целом. Как насчет строки, как это:

[a] [b] 

Я считаю, это будет превращен в

[a]_[b] 

Может (?<=\[[^\]]*?)(\s(?<=\s))(?=[^\[]*?\]) работы, может быть, это не - это беспорядок, так или иначе!

Вы действительно должны рассмотреть возможность извлечь все группы \[([^\]]*)\], затем со вторым шагом переписать их.

SQL, вероятно, не является обычным языком, но контекст бесплатный. (См Чомски иерархии)

+0

Спасибо за ваш пост! Да, ваш второй вариант: '(? <= \ [[^ \]] *?) (\ S (? <= \ S)) (? = [^ \ [] *? \])' Сделал трюк для что я искал. Еще раз спасибо! –

+0

Я также проверил его с несколькими пробелами между квадратными скобками, и это тоже сработало! –

+0

Это все еще взломать. Я не думаю, что regexp - это «швейцарская армейская цепная пила», которую мы должны использовать, чтобы нарезать все. –

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

+0

Мне тоже удалось заставить это работать! Я собираюсь использовать другое решение, потому что я могу зайти в новое регулярное выражение. Спасибо за сообщение, хотя! –

Смежные вопросы