Чистое решение регулярных выражений для удаления всего текста после определенной части текста (в файле plist) - PullRequest
0 голосов
/ 16 октября 2019

Я просмотрел все вопросы здесь, но не смог найти ответ на свой. Я хочу удалить весь текст, который следует за определенной текстовой частью. Не внутри строки, а на самом деле весь следующий текст!

Вот пример списка (это на самом деле простой пример. Обычно список значительно длиннее, но это не должно иметь никакого отношения квопрос или ответ):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>WFWorkflowActions</key>
    <array>
        <dict>
            <key>WFWorkflowActionIdentifier</key>
            <string>is.workflow.actions.comment</string>
            <key>WFWorkflowActionParameters</key>
            <dict>
                <key>WFCommentActionText</key>
                <string>Comment</string>
            </dict>
        </dict>
    </array>
    <key>WFWorkflowClientRelease</key>
    <string>3.0</string>
    <key>WFWorkflowClientVersion</key>
    <string>1030.14</string>
    <key>WFWorkflowIcon</key>
    <dict>
        <key>WFWorkflowIconGlyphNumber</key>
        <integer>59771</integer>
        <key>WFWorkflowIconStartColor</key>
        <integer>463140863</integer>
    </dict>
    <key>WFWorkflowImportQuestions</key>
    <array/>
    <key>WFWorkflowInputContentItemClasses</key>
    <array>
        <string>WFAppStoreAppContentItem</string>
        <string>WFArticleContentItem</string>
        <string>WFContactContentItem</string>
        <string>WFDateContentItem</string>
        <string>WFEmailAddressContentItem</string>
        <string>WFGenericFileContentItem</string>
        <string>WFImageContentItem</string>
        <string>WFiTunesProductContentItem</string>
        <string>WFLocationContentItem</string>
        <string>WFDCMapsLinkContentItem</string>
        <string>WFAVAssetContentItem</string>
        <string>WFPDFContentItem</string>
        <string>WFPhoneNumberContentItem</string>
        <string>WFRichTextContentItem</string>
        <string>WFSafariWebPageContentItem</string>
        <string>WFStringContentItem</string>
        <string>WFURLContentItem</string>
    </array>
    <key>WFWorkflowMinimumClientVersion</key>
    <integer>900</integer>
    <key>WFWorkflowMinimumClientVersionString</key>
    <string>900</string>
    <key>WFWorkflowTypes</key>
    <array>
        <string>NCWidget</string>
        <string>WatchKit</string>
    </array>
</dict>
</plist>

Я хочу удалить все, включая и после:

</array>
    <key>WFWorkflowClientRelease</key>

Все разрывы строк / новые строки должны быть сохранены.

Результат будет выглядеть следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>WFWorkflowActions</key>
    <array>
        <dict>
            <key>WFWorkflowActionIdentifier</key>
            <string>is.workflow.actions.comment</string>
            <key>WFWorkflowActionParameters</key>
            <dict>
                <key>WFCommentActionText</key>
                <string>Comment</string>
            </dict>
        </dict>

Я даже нашел способ найти решение, но для этого мне пришлось удалить все новые строки, что нежелательно. Я впервые использовал \n. Затем я заменил </array><key>WFWorkflowClientRelease</key> на lrtxplqw, а затем удалил все после, включая lrtxplqw на lrtxplqw.*$. Таким неловким способом мне удалось удалить все, включая и после lrtxplqw. Но решение не является удовлетворительным, потому что разрывы строк / все новые строки должны быть сохранены.

Я также был бы рад удалить первую часть, которая будет:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>WFWorkflowActions</key>
    <array>

Окончательный результат выглядел бы так:

<dict>
            <key>WFWorkflowActionIdentifier</key>
            <string>is.workflow.actions.comment</string>
            <key>WFWorkflowActionParameters</key>
            <dict>
                <key>WFCommentActionText</key>
                <string>Comment</string>
            </dict>
        </dict>

Я надеюсь, что выразил себя ясно и понятно, и я был бы очень рад, если бы кто-то мог мне помочь.

1 Ответ

0 голосов
/ 16 октября 2019

Вы можете использовать

^[\s\S]*?<array>|</array>\s*<key>WFWorkflowClientRelease</key>[\s\S]*

См. Демоверсию regex .

График регулярных выражений :

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...