Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/34: Рейтинг темы: голосов - 34, средняя оценка - 4.74
 Аватар для alhaos
1929 / 545 / 154
Регистрация: 20.02.2019
Сообщений: 2,664
Записей в блоге: 65

-replace регулярные выражения

22.01.2020, 09:19. Показов 6650. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
PowerShell
1
2
3
4
5
6
7
"вторник
понедельник
воскресенье
суббота
пятница
четверг
среда" -replace ".+", ('''$0''') -replace '\n', ",`n" -replace "[\w\W]+", '($0)'
Code
1
2
3
4
5
6
7
('вторник',
'понедельник',
'воскресенье',
'суббота',
'пятница',
'четверг',
'среда')
частенько приходится делать вот такие операции, можно это как нибудь оптимизировать?

Добавлено через 3 минуты
и еще есть пара вопросов

почему
PowerShell
1
-replace '\n', ",`n"
работает
а
PowerShell
1
-replace '\n', ",`\n"
нет

и
почему

PowerShell
1
"среда" -replace ".*", ('''$0''')
Code
1
'среда'''
PowerShell
1
"среда" -replace ".+", ('''$0''')
Code
1
'среда'
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.01.2020, 09:19
Ответы с готовыми решениями:

Выделить из строки имя компьютера, используя регулярные выражения
День добрый! Никак не удается мне один фокус. Имеем таку строчку: Нужно вытащить Причем здесь может попадаться и кириллица.

PHP регулярные выражения [ replace ]
Доброго времени суток, прошу помочь с двумя кейсами по замене выражений в html коде 1 кейс - замена части html кода в изображении ...

Регулярные выражения: круглые скобки в replace
Здравствуйте, подскажите пожалуйста, как с помощью метода replace в javascript заменить выражение, содержащее круглые скобки. Ситуация...

16
22 / 18 / 4
Регистрация: 28.07.2015
Сообщений: 167
22.01.2020, 10:36
Когда мне нужно передать допустим столбец данных из Excel в PS как массив,
я делаю вот так:
1. Выделяю столбец и нажимаю Ctrl+c
2.
PowerShell
1
$data = get-clipboard
0
Покинул форум
3701 / 1484 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
22.01.2020, 15:12
alhaos, не много ли оператора -replace?
PowerShell
1
"($((Get-Culture).DateTimeFormat.DayNames -replace '.+', '''$0''' -join ','))"
Что касается разности квантификаторов * и +, - она есть, но почему-то никто ей не придает значения: * "захватывает" ноль и более атомов, в то время как + - один и более , - иными словами:
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# заключить строку в кавычки и подставить еще две в конец строки
'среда' -replace '.*', '''$0'''
 
# произвести подстановку двух одиночных кавычек в конец
# строки без заключения самой строки в кавычки
'среда' -replace '.*', '$0'''
 
# явно указать, что строка обрамляется одиночными кавычками
'среда' -replace '.*', '''$0'
 
# добавить одиночную кавычку в начало строки
'среда' -replace '.+', '''$0'
 
# добавить одиночную кавычку в конец строки
'среда' -replace '.+', '$0'''
 
# заключить строку в одиночные кавычки
'среда' -replace '.+', '''$0'''
0
 Аватар для alhaos
1929 / 545 / 154
Регистрация: 20.02.2019
Сообщений: 2,664
Записей в блоге: 65
22.01.2020, 15:36  [ТС]
Цитата Сообщение от greg zakharov Посмотреть сообщение
"($((Get-Culture).DateTimeFormat.DayNames -replace '.+', '''$0''' -join ','))"
тут дни недели как пример текстового списка, не более, вариант разобрать на массив, потом собрать наверное так православнее... да.

тут я не понимаю

PowerShell
1
2
3
4
5
[regex]::Matches('string', '.*').Groups.Count
[regex]::Matches('string', '.+').Groups.Count
 
2
1
Добавлено через 58 секунд
PowerShell
1
[regex]::Matches('string', '.*').Groups[1].Value
откуда вот эта пустая строка?
0
Покинул форум
3701 / 1484 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
22.01.2020, 16:14
alhaos, если так будет понятней:
PowerShell
1
2
[Regex]::Matches('string', '.*') # '.*' => '.{0,}'
[Regex]::Matches('string', '.+') # '.+' => '.{1,}'
Отсюда и пустая группа.
Цитата Сообщение от alhaos
вариант разобрать на массив, потом собрать наверное так православнее...
Кому как. Можно поступить, скажем, так:
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$l = @'
понедельник
вторник
среда
четверг
пятница
суббота
воскресенье
'@
 
# $l.GetType().Name => String
$l = ($$="($($l -replace '.+', '''$0'',')").Remove($$.length-1) + ')'
<# в итоге $l =>
('понедельник',
'вторник',
'среда',
'четверг',
'пятница',
'суббота',
'воскресенье') #>
0
 Аватар для alhaos
1929 / 545 / 154
Регистрация: 20.02.2019
Сообщений: 2,664
Записей в блоге: 65
23.01.2020, 06:44  [ТС]
Цитата Сообщение от greg zakharov Посмотреть сообщение
alhaos, если так будет понятней:
PowerShellВыделить код
1
2
[Regex]::Matches('string', '.*') # '.*' => '.{0,}'
[Regex]::Matches('string', '.+') # '.+' => '.{1,}'
Отсюда и пустая группа.
Э... неа походу трудный я

PowerShell
1
2
3
4
5
6
7
8
9
PS C:\> ([regex]::Matches('string', '.*').groups.value).ForEach{"\$_\"}
\string\
\\
 
PS C:\> ([regex]::Matches('', '.*').groups.value).ForEach{"\$_\"}
\\
 
PS C:\> ([regex]::Matches('string', '^.*$').groups.value).ForEach{"\$_\"}
\string\
0
 Аватар для volodin661
6799 / 2297 / 349
Регистрация: 10.12.2013
Сообщений: 7,924
23.01.2020, 20:08
Лучший ответ Сообщение было отмечено alhaos как решение

Решение

Цитата Сообщение от alhaos Посмотреть сообщение
почему
PowerShell
1
-replace '\n', ",`n"
работает
а
PowerShell
1
-replace '\n', ",`\n"
нет
В северо-американской части человечества исторически сложилась привычка
изображать невидимые символы ASCII-таблицы с помощью метасимволов, используя приставку \ бэкслэш в качестве этой самой 'меты'

\n - newline <NL>
\r - carriage return <CR>
\t - horizontal tabulation <TAB>
итд

и использовать прямой / слэш в качестве разделителей путей.

Но корпорация IBM зачем-то поддержала 'прогрессивную' идею использовать в путях бэкслэш и использовала их
в интерпретаторах OS/2 cmd и REXX, что по наследству перешло и к Microsoft ( rexx к сожалению не перешёл ).

В результате в powershell имеем:

"C:\newfolder\file.txt"

и как тут быть с такой \n ?? Или использовать "C:\\newfolder\\file.txt", как это делается в языке "C" ?

Но в командном шелл работа с путями происходит ежесекундно и это должно быть удобно.

Поэтому метасимвол бэкслэш (\) в строке с интерпретирующими кавычками заменили на метасимвол бэктик (`)
`n - newline <NL>
`r - carriage return <CR>
`t - horizontal tabulation <TAB>

но `x - это просто символ x, никакого метазначения у него нет,
а `\ - это просто бэкслэш, а `\n - это бэкслэш, за которым следует буква n.


Но в синтаксисе самих регулярных выражениях бэкслэш по-прежнему исполняет привычную историческую роль приставки для метасимвола.

Добавлено через 3 часа 26 минут
Цитата Сообщение от alhaos Посмотреть сообщение
PowerShell
1
[regex]::Matches( 'string',  '(.*)' ).Groups[1].Value
откуда вот эта пустая строка?

Из теории.
Одним из возможных значений после применения квантификатора '*' является 'НИЧЕГО'
и вот это НИЧЕГО сразу совпало с истиной в самом начале исследуемой строки.
А поскольку при разных вариантах совпадений выигрывает самое левое значение, то именно оно ( НИЧЕГО ) и вернулось.

Добавлено через 12 минут
0 1 2 3 4 5 6
string
↸ совпало здесь и дальше механизм рег.выр. даже дёргаться не стал, а сразу вернул значение, потому что левее нуля (начало строки) ничего быть не может.
1
 Аватар для alhaos
1929 / 545 / 154
Регистрация: 20.02.2019
Сообщений: 2,664
Записей в блоге: 65
24.01.2020, 06:34  [ТС]
Благодарю за подробный ответ, а лирические, исторические отступления вааще огонь!
0
Любознательный
 Аватар для YuS_2
7406 / 2256 / 360
Регистрация: 10.03.2016
Сообщений: 5,216
25.01.2020, 12:53
Цитата Сообщение от volodin661 Посмотреть сообщение
Из теории.
Одним из возможных значений после применения квантификатора '*' является 'НИЧЕГО'
и вот это НИЧЕГО сразу совпало с истиной в самом начале исследуемой строки.
А поскольку при разных вариантах совпадений выигрывает самое левое значение, то именно оно ( НИЧЕГО ) и вернулось.
Малопонятно, кстати.
Из теории:
. - любой символ, с зависимостью от ключа (?-s) относительно символа перевода строки
* - жадный квантификатор
^ - спецсимвол начала строки
Code
1
2
3
4
PS_5.1> "хмм" -replace '.*', '1'
11
PS_5.1> "хмм" -replace '^.*', '1'
1
- отсюда вывод ...
Хмм, а вот хз, что за вывод. Где логика?
Если точка - любой символ, то захвачено должно быть всё в единый блок и замена должна произойти на единственный символ "1", но увы и ах...
Если точка - не совсем любой символ, т.е. не захватывает символ "^", то всё равно, замена должна быть произведена один раз, а начало строки "^" никаким образом не заменится.
Главный вопрос по этому шаблону: '^.*', который захватывает всё и замена происходит один раз...
Чушь какая-то или багофича...
0
 Аватар для volodin661
6799 / 2297 / 349
Регистрация: 10.12.2013
Сообщений: 7,924
26.01.2020, 14:43
Цитата Сообщение от YuS_2 Посмотреть сообщение
Малопонятно, кстати.
ok, давай разберём.


PowerShell
1
"xmm" -replace '.*', '1'
результат: 11.
при шаблоне .* первый раз совпадение случится в самом начале строки даже при отсутствии каких бы то ни было символов в этой строке. и это будет 1-я единица. Но -replace по умолчанию имеет режим глобальной
замены, поэтому процесс продолжится и вторая единица на выходе - это результат замены на неё всех символов в строке.

для сравнения:
PowerShell
1
"хмм" -replace '.+', '1'
результат: одна единица, и это результат замены на неё всех символов в строке.

PowerShell
1
"хмм" -replace '^.*', '1'
а вот тут можно много слов написать. для об'яснения.
надо подумать..
0
Любознательный
 Аватар для YuS_2
7406 / 2256 / 360
Регистрация: 10.03.2016
Сообщений: 5,216
26.01.2020, 18:20
Цитата Сообщение от volodin661 Посмотреть сообщение
при шаблоне .* первый раз совпадение случится в самом начале строки даже при отсутствии каких бы то ни было символов в этой строке. и это будет 1-я единица.
Допустим.

Цитата Сообщение от volodin661 Посмотреть сообщение
Но -replace по умолчанию имеет режим глобальной замены, поэтому процесс продолжится и вторая единица на выходе - это результат замены на неё всех символов в строке.
Тут дело даже не в -replace, так работает движок регулярок, причем не только в dotnet, но и в других средах, хоть и не во всех (например, в Powergrep 5, всё работает как положено)...
Почему говорю о багофиче?
Учитывая допущение, указанное выше, даже если было совпадение шаблона, то в силу жадности квантификатора, движок регэкспов просто обязан, после всех шагов, выдать единственное совпадение шаблона со всем текстом, включая непечатные символы, ибо . - любой символ.
Опять таки, если допущение считать верным, то и такой шаблон:
PowerShell
1
"хмм" -replace '.*м', '1'
должен отработать ровно также, т.е. выдать две единицы вместо одной, но... вот не получается.
А ежели, квантификатор сделать ленивым:
PowerShell
1
"хмм" -replace '.*?', '1'
то вообще, можно пронаблюдать "веселые картинки"...
Так что, багофича - она и есть багофича.
0
 Аватар для volodin661
6799 / 2297 / 349
Регистрация: 10.12.2013
Сообщений: 7,924
26.01.2020, 19:18
Цитата Сообщение от YuS_2 Посмотреть сообщение
.*м должен отработать ровно также, т.е. выдать две единицы вместо одной, но... вот не получается.
это почему ??
я, когда отвечал alhaos, написал, что выражение .* имеет своим допустимым значением 'НИЧТО',
которое прекрасно находится движком в самом начале строки и выигрывает.

а .*м - это совсем другое дело.

Добавлено через 2 минуты
.*м* вот так выдаст две.
0
Любознательный
 Аватар для YuS_2
7406 / 2256 / 360
Регистрация: 10.03.2016
Сообщений: 5,216
26.01.2020, 20:28
Цитата Сообщение от volodin661 Посмотреть сообщение
это почему ??
из-за жадности квантификатора. Ведь движок регэкспов работает буквально, т.е. посимвольно читается как:
совпадает если ноль или более символов, за которыми сразу следует символ "м"
То бишь, часть шаблона .* просто обязана захватить максимальное количество символов до крайнего символа "м", а уже после захвата передать следующим шагом конечный символ "м", а т.к. такой шаблон захватывает и "ничего", то он должен возвращать два совпадения (поведение шаблона не должно изменяться от наличия или отсуствия рядом ещё одного шаблона в составе большего, имхо), конечно, если вышеупомянутое допущение считать верным.
Но я так и не понимаю, с какого такого перепуга простой шаблон ".*", который, всего лишь, обязан возвращать совпадение ноль или более любых символов, вдруг возвращает два совпадения вместо единственного?

Цитата Сообщение от volodin661 Посмотреть сообщение
имеет своим допустимым значением 'НИЧТО',
которое прекрасно находится движком в самом начале строки и выигрывает.
У чего "выигрывает", у самого себя? "ничто" должно возвращаться вместе с остальными символами, т.к. шаблон состоит всего из одного метасимвола с жадным квантификатором. Разве нет?
Да и вообще, такое поведение должно быть описано в документации, но увы так и не нашел ничего похожего... может плохо искал? Есть какие-нибудь данные из заслуживающих доверия источников?
0
 Аватар для volodin661
6799 / 2297 / 349
Регистрация: 10.12.2013
Сообщений: 7,924
26.01.2020, 21:04
YuS_2, внимательнее,
классик же всё сразу
написал:

Цитата Сообщение от volodin661 Посмотреть сообщение
Из теории.
Одним из возможных значений после применения квантификатора '*' является 'НИЧЕГО'
и вот это НИЧЕГО сразу совпало с истиной в самом начале исследуемой строки.
А поскольку при разных вариантах совпадений выигрывает самое левое значение, то именно оно ( НИЧЕГО ) и вернулось.
Добавлено через 6 минут
Термин 'Жадность' к этому соревнованию не имеет отношения,
жадность относится к тому, где остановится внутренний курсор, когда движок будет перебирать состояния при
отработке шаблона .*. А остановится он на последнем символе. А индекс у этого символа - 2,
в то время как индекс у совпавшего НИЧТО - 0, он левее и поэтому выиграл.

Добавлено через 17 минут
и вот теперь весьма интересно будет разобраться, почему после
PowerShell
1
"хмм" -replace '.*?', '1'
вывод:
1х1м1м1
0
Любознательный
 Аватар для YuS_2
7406 / 2256 / 360
Регистрация: 10.03.2016
Сообщений: 5,216
26.01.2020, 23:48
Цитата Сообщение от volodin661 Посмотреть сообщение
Термин 'Жадность' к этому соревнованию не имеет отношения,
жадность относится к тому, где остановится внутренний курсор, когда движок будет перебирать состояния при
отработке шаблона .*. А остановится он на последнем символе. А индекс у этого символа - 2,
в то время как индекс у совпавшего НИЧТО - 0, он левее и поэтому выиграл.
Хорошо, согласен, теперь понятнее. Просто шаблон, по умолчанию, не может быть пустым и обязательно состоит, либо с минимальным совпадением хотя бы одного символа, либо "ничего" и поэтому шаблон .* отрабатывает два раза... тем более, что я таки нашел некоторую документацию по PCRE. Там это поведение является настраиваемым (PCRE2_NOTEMPTY), в отличие от dotnet.
Ещё здесь попалось хорошо разжеванное объяснение.
В общем, теперь есть некоторое понимание логики.

Цитата Сообщение от volodin661 Посмотреть сообщение
и вот теперь весьма интересно будет разобраться, почему после
Ну, здесь-то, как раз, просто... ленивый квантификатор позволяет шаблону захватывать только минимальное количество символов и соответственно, при таком шаблоне будет происходить захват в два шага: "ничего" и любой символ и в конце опять "ничего"...
Но, однако, это никак не объясняет того, почему сами символы не заменяются... в PCRE всё работает верно, там получаем 7 единиц, а вот с dotnet-ом прям бяда.
И да, так и остался не рассмотренным вопрос с шаблоном ^.* - это ведь тоже шаблон нулевой длины, но однако не получается захватить "ничего", в отличие от такого варианта: ^|.*.
Но опять же, в dotnet, это работает довольно странно:
PowerShell
1
"хмм" -replace '^|.*','1'
символ "х" остается без замены...
В общем, пока одни сплошные разрывы шаблонов...
0
9 / 9 / 1
Регистрация: 27.02.2013
Сообщений: 156
15.02.2022, 12:26
Народ, а подскажите. Повершел может найти в текстовом определенное ключевое слово и заменить его например инкрементом от моего начального значения?
Например, начальное 220. Первое вхождение будет 220, второе 221 и т.д.
И расширение вопроса - математические операции с инкрементом. Первое 220*0.5, второе 221*0.5 и т.д
Спасибо!
0
 Аватар для alhaos
1929 / 545 / 154
Регистрация: 20.02.2019
Сообщений: 2,664
Записей в блоге: 65
15.02.2022, 13:06  [ТС]
мне вот такое решение в голову пришло

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#Requires -Version 7
 
using namespace System.Text
 
$SomeText = @"
Когда-то  давно Козлов занимался  боксом, несколько раз получал нокаут,
оттого и было знакомо ему состояние, когда  возвращаешься из  небытия, когда
сначала  не чувствуешь  своего тела и будто впервые  открываешь,  что ты  --
есть;  затем сознание  выходит вовне и обнаруживает мир.  Оно  само еще  как
тысяча  осколков.  Но вот осколки медленно, потом все быстрее  стягиваются к
центру,  воссоздавая целое.  И  тогда  происходит  узнавание себя  и мира  и
начинаешь чувствовать свое тело.
"@
 
$Chanks = $SomeText -split "а"
$StringBuilder = [StringBuilder]::new()
$i = 220
 
foreach ($Chank in $Chanks) {
    $null = $StringBuilder.Append([string]::Concat($Chank, ($i++)))
} 
 
$StringBuilder.ToString()
Когд220-то д221вно Козлов з222ним223лся боксом, несколько р224з получ225л нок226ут,
оттого и было зн227комо ему состояние, когд228 возвр229щ230ешься из небытия, когд231
сн232ч233л234 не чувствуешь своего тел235 и будто впервые открыв236ешь, что ты --
есть; з237тем созн238ние выходит вовне и обн239ружив240ет мир. Оно с241мо еще к242к
тысяч243 осколков. Но вот осколки медленно, потом все быстрее стягив244ются к
центру, воссозд245в246я целое. И тогд247 происходит узн248в249ние себя и мир250 и
н251чин252ешь чувствов253ть свое тело.254
Добавлено через 4 минуты
Косяк в конце тоже инкремент

PowerShell
1
$StringBuilder.ToString().TrimEnd(($i-1).ToString())
такой костыль пока можно воткнуть
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.02.2022, 13:06
Помогаю со студенческими работами здесь

Регулярные выражения. Replace - По маске вырезать определённые значения
Всем привет. Нужно по маске вырезать определённые значения. Вроде делаю всё правильно, но в итоге у меня input == out. Помогите...

Регулярные выражения replace, поменять одинарные кавычки на двойные
Делаю замену кавычек но если ввести слово don't то все равно меняет. Как сделать что бы в слове don't не меняло. function...

ЧПУ. Замена строк, регулярные выражения. Как правильно использовать переменную в регулярные выражения ?
Здравствуйте! Решил реализовать ЧПУ на своем сайте. Первый этап это замена всех реальных ссылок на чпу ссылки. Так вот при замене я...

регулярные выражение Replace
Приветствую уважаемые разработчики! Подскажите пожалуйста. Задача - необходимо все названия файлов и их расширения перевести в...

Регулярные выражения - вывод сообщения об ошибке при нахождении в строке выражения, начинающегося с цифры
Нужно чтобы при нахождении в строке выражения начинающегося с цифры появлялось сообщение об ошибке,например если ввести :2a,то будет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru