2016-03-24 4 views
1

Я пытаюсь использовать регулярное выражение powershell, чтобы вытащить данные из файла AssemblyInfo.cs. Регулярное выражение ниже - моя лучшая попытка, однако она тянет только строку [assembly: AssemblyVersion(". Я поместил это регулярное выражение в пару тегов веб-регулярных выражений, и он СМОТРЕТЬ, как будто он делает то, что я хочу, однако это моя первая проблема при использовании регулярного выражения powershell, чтобы я мог смотреть на него неправильно.Извлечь все данные между двумя двойными кавычками

$s = '[assembly: AssemblyVersion("1.0.0.0")]' 
$prog = [regex]::match($s, '([^"]+)"').Groups[1].Value 

ответ

4

Вы также должны включать начальные двойные кавычки в противном случае было бы начать запись с самого начала, пока первый " не будет достигнута.

$prog = [regex]::match($s, '"([^"]+)"').Groups[1].Value 
          ^
3

Попробуйте это регулярное выражение "([^"]+)"

Regex101 Demo

+0

Вы также можете использовать '(\ d + \.?) +' [Demo здесь] (https://www.regex101.com/r/qI4wG6/3) если вы просто хотите версию нет. –

0

Для общего решения данных между двойными кавычками, другие ответы велики. Однако, если бы я разбирал AssemblyInfo.cs для строки версии, я был бы более явным.

$versionString = [regex]::match($s, 'AssemblyVersion.*([0-9].[0-9].[0-9].[0-9])').Groups[1].Value 
$version = [version]$versionString 

$ versionString

1.0.0.0 

$ версия

Major Minor Build Revision 
----- ----- ----- -------- 
1  0  0  0  

Update/Edit:

относящегося к разбору версии (опять же, если это не общий вопрос о разборе текста между двойными кавычками) заключается в том, что я бы не стал у меня есть версия в формате M.m.b.r в моем файле, потому что я всегда обнаружил, что Major.minor достаточно, и используя формат 1.2.* дает вам дополнительную информацию без каких-либо усилий.

См. Compile date and time и Can I generate the compile date in my C# code to determine the expiry for a demo version?.

При использовании * для третьей и четвертой части версии сборки, то эти две части устанавливаются автоматически во время компиляции следующих значений:

третья часть является количество дней с момента 2000-01-01

четвертая часть является число секунд, прошедших с полуночи, разделенное на два (хотя некоторые страницы MSDN говорят, что это случайное число)

Кое-что, о чем я думаю, в большей картине версий, требующих 1.2. *, Допускающих 1.2 или 1.2.3 или принимающих только 1.2.3.4 и т. Д.

+0

Я бы предложил заменить '[0-9]' на символ '/ d' для цифр. Вам также нужно использовать '+' в том случае, если любой из компонентов (майор, минор, сборка, ревизия) перейдет к двум цифрам следующим образом: ** 5.12.1.11 **. – doron

+0

@doron, хорошая обратная связь, спасибо. Я обновил свой ответ, чтобы отразить то, что я делаю на практике, вместо того, чтобы пытаться разобрать каждую комбинацию числа, что теперь заставляет меня думать о сканировании других/старых проектов для «нежелательных» строк версии, чтобы использовать мои предпочтительные методы. Еще раз спасибо за задумчивый комментарий. –

1

Регулярные выражения могут быть трудночитаемыми, поэтому Лучшая практика заключается в том, чтобы сделать их такими же простыми, какими они могут быть, все еще разрешая все возможные случаи, которые вы можете увидеть. Вы пытаетесь получить единственную числовую последовательность во всей строке, поэтому мы должны искать это и обходить с помощью групп.

$s = '[assembly: AssemblyVersion("1.0.0.0")]' 
$prog = [regex]::match($s, '[\d\.]+').Value 

$ прог

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