RegEx за несоответствие последовательности в PowerShell - PullRequest
1 голос
/ 15 мая 2019

Я хочу проверить строку, и регулярное выражение не должно совпадать, когда точка "." имеет "-" или "_" непосредственно перед или после него.

Я предполагаю, что лучшим подходом будет негативное предвидение, но, похоже, я не могу понять это правильно.

Ответы [ 2 ]

5 голосов
/ 15 мая 2019

Вы можете использовать это регулярное выражение на основе lookarounds , которое будет отклонять совпадение с точкой, которой предшествует _ или - или сопровождается _ или -

^.*(?<![-_])\.(?![-_]).*$

Regex Demo

Powershell,

PS C:\Users\user> $reg = "^.*(?<![-_])\.(?![-_]).*$"
PS C:\Users\user> $str = "aaa . aaa"
PS C:\Users\user>
PS C:\Users\user> $str -match $reg
True

PS C:\Users\user> $reg = "^.*(?<![-_])\.(?![-_]).*$"
PS C:\Users\user> $str = "aaa ._ aaa"
PS C:\Users\user>
PS C:\Users\user> $str -match $reg
False
1 голос
/ 15 мая 2019

Вам необязательно нужен обходной путь,
, непосредственно использующий класс отрицанных символов, также подойдет:

$RE = [regex]'.*[^_-]\.[^_-].*'

@"
foo.bar
foo_.bar
foo._bar
foo-.bar
foo.-bar
"@ -split '\r?\n' | ForEach-Object {
    if ($_ -match $RE){
        "{0} matches `$RE" -f $_
    } else {
        "{0} doesn't match `$RE" -f $_
    }
}

Пример вывода:

foo.bar matches $RE
foo_.bar doesn't match $RE
foo._bar doesn't match $RE
foo-.bar doesn't match $RE
foo.-bar doesn't match $RE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...