Я хочу удалить любое слово в конце строки, кроме слова «деньги».
«Привет, Моне» должно быть «Привет» «Привет, деньги» должно быть «Привет, деньги»
Я провел много часов и ничего не произошло..
'Hellow money' -replace '.*[^money]$'
Это очень просто. Код представляет собой одну строку, и он не работает так, как я хочу: «Hello Money» -replace «.*[^money]$» Если изменить на «Hello monet», строка будет удалена целиком. Но я хочу только последнее слово
$A = 'Hello Monet'; $A = $A.Replace('Monet',''); $A
. Это просто пример
Вы немного неправильно поняли. Мне нужно удалить все последнее слово, кроме «деньги». Например «Hello world» — последнее слово «world» также следует удалить. мне нужно регулярное выражение
Я рассказал, просто пример для одной переменной. Если их несколько, вы используете ForEach
, -match
, .EndsWith()
и т. д.
Разбить его на две части? Строка выбора в PowerShell 7 выделяет совпадения с регулярными выражениями, поэтому ее удобно опробовать шаблоны регулярных выражений (или regex101.com). \w
— символы в слове. [^money]$
смотрит на каждого персонажа отдельно, например [^y]$
.
'Hello monet','Hello money' |
foreach-object {
if ( $_ -match '\Wmoney$' ) { # non word character added
$_
}
else {
$_ -replace '\w*$'
}
}
Hello
Hello money
ФП, возможно, придется уточнить крайний случай - что, если в последнем слове в качестве суффикса есть слово «деньги» - например. «привет loadamoney» — поскольку последнее слово не равно «деньги», следует его удалять или нет…
Оно работает! Спасибо. Но можно ли использовать регулярное выражение без условия?
Возможно, они меня не понимают. У меня всегда одна строчка, просто меняется содержание. «Привет, мир!», «Привет, деньги» или «Привет всем!»
Я пытаюсь не что-то подобное, и это не работает :) 'Hello monet' -replace '(Hello)\s+(!(money))','$1'
Мне нужно как-то использовать отрицание, но я не могу понять, как
ок, отвечаю на ваш первый вопрос - возможно, последнее слово может содержать суффикс
если вам нужны дополнительные условия, возможно, вам стоит отредактировать вопросы
Вы можете использовать шаблон \s(?!money$).*
для одиночных линий. Подробности смотрите https://regex101.com/r/RBueqz/2.
'Hello monet', 'Hello money' -replace '\s(?!money$).*'
# Outputs:
# Hello
# Hello money
И (?m)(?<=^\S*)\s(?!money$).*
для многострочных строк. Подробности смотрите https://regex101.com/r/e5H76U/1.
@'
Hello monet
Hello money
'@ -replace '(?m)(?<=^\S*)\s(?!money$).*'
Можно ли это упростить до '\s(?!money$).*'
, используя только пробел, отрицательный просмотр вперед и второе слово?
Если $
обозначает конец строки, что делает .*
после него?
@lit удалить все после пробела, включая его
@lit $
находится внутри отрицательного просмотра, но .*
на самом деле соответствует второму слову
пожалуйста, укажите код сценария, который вы пробовали