Назад | Перейти на главную страницу

Regex работает везде (пробовал regex101 и regstorm.net), кроме Powershell

Я пробовал разные комбинации и уже проверял другие похожие сообщения, но не могу найти свой ответ. У меня есть файл .config, и мне нужно исключить комментарии из файла, когда я выполняю поиск, как показано ниже:

(Get-Content C:\Path\File.config -Raw) | Select-String  '(<!--((?!-->)(.|\n))*-->)'  -AllMatches

Я также пробовал следующее регулярное выражение:

(?smi)^\<!--.*?--\>?

Оба они работают с regex101 и regex.net, но не работают с Powershell. Вот как выглядит мой файл .config:

Test

<!--<add name=                                />
    <add name=                                />
    <add name=                                />-->
    <add name=                                />

<!--<add name=                                />
    <add name=                                />-->

Test
Test

Я убедился, что использую -Raw с моим get-content, а также попробовал out-string. Эти регулярные выражения работают везде, кроме PowerShell. Ваша помощь по достоинству оценена

Почему вы пытаетесь анализировать XML вручную с помощью Regex, когда в Powershell встроен совершенно хороший анализатор XML?

Чтобы удалить комментарии из существующего файла XML, проанализируйте файл, найдите все комментарии с выражением XPath, удалите их и сохраните файл следующим образом:

$xml = [xml](Get-Content C:\Path\File.config)
# You might need to tweak the XPath expression for your file,
# but this works for me on a random .NET app.config
$comments = $xml.SelectNodes('descendant::comment()')
$comments | %{ $_.ParentNode.RemoveChild($_) | out-null }
$xml.Save('C:\Path\File-output.config')

Но похоже, что даже это перебор для того, что вы пытаетесь сделать.

Пытаюсь вывести файл без комментариев. Затем я поиграю с этим выводом без комментариев и создам CSV, используя эти данные.

В таком случае почему бы просто не поиграть с проанализированным XML напрямую и просто проигнорировать комментарии. После того, как вы проанализировали файл, используя первую строку из приведенного выше примера, у вас есть отличный XML-объект со всеми данными, которые вы можете запрашивать, обрабатывать и выводить как CSV. Вам не нужно предварительно экспортировать файл без комментариев.

Если вам нужна помощь в выяснении того, как работать с XML-данными в Powershell, в Интернете есть буквально тысячи статей, которые могут помочь. Google здесь ваш друг.

(<!--((?!-->)(.|\r\n))*-->) работал в Notepad ++ в Windows для меня.

Я считаю \n требуется в некоторых ОС и на большинстве веб-сайтов, но \r\n требуется в Windows. Очевидно, каждая ОС обрабатывает символы новой строки по-своему.

 

Обновление: 2017/08/16 12:39

Мне показалось, что это сработало: (Get-Content C:\Path\File.config -Raw) | Select-String '(<!--((?!-->)(.|\n))*-->)' -AllMatches | ForEach { $_.Matches.Value }