#regex #powershell
#регулярное выражение #powershell
Вопрос:
У меня есть файл «dic.txt » и мне нужно выполнить поиск по всем словам, которые не содержат гласных.
$dic = gc "dic.txt"
$v = @("aeiou")
foreach ($line in $dic){$line | ?{$_ -notcontains $v}}
Но это не работает.
Ответ №1:
попробуйте это:
$dic = gc "dic.txt"
foreach ($line in $dic)
{
$line | ? { $_ -notmatch 'a|e|i|o|u' }
}
Комментарии:
1. Я забыл букву «y» :- )
Ответ №2:
Если у вас есть по одному слову в каждой строке, что-то вроде этого:
Select-String '(?i)^(?:(?![aeiou])[a-z-]) $' 'dic.txt'
Объяснение
(?i)
делает его нечувствительным к регистру^
Привязка утверждает, что мы находимся в начале строки(?:(?![aeiou])[a-z])
соответствует одной букве, которая не являетсяa
,e
,i
,o
илиu
$
Привязка утверждает, что мы находимся в конце строки
Комментарии:
1. Возможно, это не относится к OP, но в случае «составленного слова», подобного
spy-story
, это не удается.2. @CB Вы имеете в виду, что оно совпадает
spy
, потому что в нем нет гласных? Вы правы, и вы также правы в том, что, возможно, это именно то, чего хочет expirat001, а может быть, и нет. Дайте нам знать, истекает 0001. 🙂3. нет, я имею в виду, что оно совпадает
spy-story
и в нем есть гласнаяo
… попробуйте небольшой тест, и вы поймете, что я имею в виду..4. @CB Это не соответствует
story
, с чего бы это? Смотрите демо5. @CB Ты прав. Я уверен, что вы это знаете, но для протокола поведение связано не с регулярным выражением, а с
grep
, которое возвращает всю строку, в которой if находит совпадение, иspy
является совпадением. Предполагая, что у нас есть по одному слову в строке, изменили регулярное выражение, чтобы слова были полностью привязаны. Хороший улов, спасибо. 🙂