Захват неверного формата текстового шаблона с помощью Regex - PullRequest
1 голос
/ 09 октября 2019

У меня есть пустые папки с NA - в начале. Правильный формат их должен быть

"NA - FolderName"

К сожалению, не все люди соблюдают это соглашение об именах. Я пытаюсь написать регулярное выражение для захвата всех паттернов АН - то есть неправильно отформатированный или повторяющий АН - .

Регулярное выражение, с которым я до сих пор придумала

N? A? - ((?! [0-9.A-MO-Z] [BZ] |) |.? N? A? -)

Здесьназвания папок, которые я использовал для проверкиТе, у кого Неверно в названии имеют NA - не в правильном формате, а те, которые я хочу записать в формате NA - в:

NA -IncorrectFolderName1
N A-1. IncorrectFolderName2
N A- 1. IncorrectFolderName3
NA-IncorrectFolderName4
N A -1.IncorrectFolderName5
NA -NA -IncorrectFolderName6
NA - NA -IncorrectFolderName7
N A - N A - IncorrectFolderName8
N A - NA - IncorrectFolderName9

NA - CorrectFolderName1
NA - 1CorrectFolderName2
NA - 1. CorrectFolderName3

СМОТРИТЕ КОД ЗДЕСЬ ДЛЯ ПРИМЕРА ЧТО Я ПЫТАЮСЯ СДЕЛАТЬ: https://regex101.com/r/9Bzo43/6

Единственный неправильный формат, который не будет записан в моем коде:

N A- 1. IncorrectFolderName3

Regex не должен захватывать правильно отформатированные папки «NA -», подобные приведенным ниже. Эти коды не должны быть захвачены.

RegularFolderName1
NA - CorrectFolderName1
NA - 1CorrectFolderName2
NA - 1. CorrectFolderName3

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

Ответы [ 2 ]

1 голос
/ 10 октября 2019

Полагаю, возможно

(?:(?:N\s*A\s*)-\s*){2}|N\s+A\s*-\s*(?=\d+\.\s*)|NA-|NA\s+-(?=\S)

или несколько похожих выражений с чередованием было бы намного проще написать и отладить.

Демо

Я не был уверен, что мы хотели бы и не хотели бы захватывать на концах, любую конечную часть, которую вы бы не хотели пролистывать / захватывать, вы можете просто поместить в позитивный прогноз (?=), который является утверждением нулевой ширины. , например:

NA\s+-(?=\S)

Схема RegEx

jex.im визуализирует регулярные выражения:

enter image description here


Если вы хотите упростить / изменить / изучить выражение, это было объяснено на верхней правой панели regex101.com . Если хотите, вы также можете посмотреть в этой ссылке , как она будет сопоставляться с некоторыми примерами ввода.


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

Используя ваши примеры, это работает:

$foldernames =  'NA -IncorrectFolderName1',
                'N A-1. IncorrectFolderName2',
                'N A- 1. IncorrectFolderName3',
                'NA-IncorrectFolderName4',
                'N A -1.IncorrectFolderName5',
                'NA -NA -IncorrectFolderName6',
                'NA - NA -IncorrectFolderName7',
                'N A - N A - IncorrectFolderName8',
                'N A - NA - IncorrectFolderName9',
                'RegularFolderName1',
                'NA - CorrectFolderName1',
                'NA - 1CorrectFolderName2',
                'NA - 1. CorrectFolderName3'

$newNames = $foldernames | ForEach-Object { $_ -replace '^(?:(N\s*A\s*-\s*))+(.+)', 'NA - $2' }

$newNames

Результат:

NA - IncorrectFolderName1
NA - 1. IncorrectFolderName2
NA - 1. IncorrectFolderName3
NA - IncorrectFolderName4
NA - 1.IncorrectFolderName5
NA - IncorrectFolderName6
NA - IncorrectFolderName7
NA - IncorrectFolderName8
NA - IncorrectFolderName9
RegularFolderName1
NA - CorrectFolderName1
NA - 1CorrectFolderName2
NA - 1. CorrectFolderName3

Regex details:

(?:              Match the regular expression below
   (             Match the regular expression below and capture its match into backreference number 1
      N          Match the character “N” literally
      \s         Match a single character that is a “whitespace character” (spaces, tabs, line breaks, etc.)
         *       Between zero and unlimited times, as many times as possible, giving back as needed (greedy)
      A          Match the character “A” literally
      \s         Match a single character that is a “whitespace character” (spaces, tabs, line breaks, etc.)
         *       Between zero and unlimited times, as many times as possible, giving back as needed (greedy)
      -          Match the character “-” literally
      \s         Match a single character that is a “whitespace character” (spaces, tabs, line breaks, etc.)
         *       Between zero and unlimited times, as many times as possible, giving back as needed (greedy)
   )
)+               Between one and unlimited times, as many times as possible, giving back as needed (greedy)
(                Match the regular expression below and capture its match into backreference number 2
   .             Match any single character that is not a line break character
      +          Between one and unlimited times, as many times as possible, giving back as needed (greedy)
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...