Шаблон REGEX для имени пользователя внутри более длинной строки
MAC OSX, PowerShell 6.1 Core
Я борюсь с созданием правильного шаблона REGEX, чтобы найти строку имени пользователя в середине URL-адреса. Короче говоря, я работаю в Powershell Core 6.1, работаю над веб-страницей и удаляю элементы "li". Я пишу это в файл, поэтому у меня есть несколько строк, как это:
<LI><A HREF="/grouplist/expand-user/jimmysmith">Smith, Jimmy</A>
Строка, в которой я нуждаюсь, является частью "jimmysmith", и каждая строка будет иметь другое имя пользователя, не более восьми буквенных символов. Моя текущая модель такова:
(<(.|\n)+?>)|( )
и я могу использовать шаблон "-relace $" в своем коде, чтобы получить часть "Смит, Джимми". Я понятия не имею, что я делаю, и любой успех в получении того, что я получил, был счастливой случайностью.
После использования нескольких онлайн-помощников регулярных выражений я все еще застрял на том, как просто получить "строку после третьего" / и до, но не включая последнюю цитату.
Спасибо за любую помощь, которую вы можете оказать мне.
3 ответа
Вы могли бы пойти очень просто,
expand-user/([^"]+)
Найти расширения-пользователя, а затем захватить до цитаты.
Ответ - то, что было отправлено Дэйвом. Я сохранил свои данные в файле (строки с "li"), выполнив:
get-content .\list.txt -ReadCount 1000| foreach-object { $_ -match "<li>"} |out-file .\transform.txt
Затем я использовал метод, предложенный Дейвом, следующим образом:
$a = get-content .\transform.txt |select-string -pattern '(?:\/.*){2}\/(?<username>.*)"' | % {"$($_.matches.groups[1])"} |out-file .\final.txt
Мне пришлось посмотреть, как вытащить имя группы, и я воспользовался этой ссылкой, чтобы понять это: как получить захваченные группы из Select-String?
(?:\/.*){2}\/(?<username>.*)"
(?:\/.*)
Соответствует буквальному /
с последующим любым количеством символов
{2}
сделать предыдущий матч два раза
\/
соответствовать другому /
(?<username>.*)"
сопоставить все до следующего "
и положить его в username
группа.
https://regex101.com/r/0gj7yG/1
Хотя, поскольку каждая строка предположительно идентична вплоть до имени пользователя:
$line = ("<LI><A HREF=\"/grouplist/expand-user/jimmysmith\">Smith, Jimmy</A> ")
$line = $line.Substring(36,$line.LastIndexOf("\""))