Regex 用于与PowerShell中的序列不匹配的正则表达式

Regex 用于与PowerShell中的序列不匹配的正则表达式,regex,powershell,regex-lookarounds,Regex,Powershell,Regex Lookarounds,我想验证一个字符串,当点“.”的前面或后面有“-”或“ux”时,正则表达式不应匹配 我认为消极的前瞻是最好的方法,但我似乎做得不对 您可以基于使用此正则表达式,该正则表达式将拒绝匹配前面有或-或后面有或-的点 ^.*(?<![-_])\.(?![-_]).*$ ^.*? Powershell PS C:\Users\user> $reg = "^.*(?<![-_])\.(?![-_]).*$" PS C:\Users\user> $str = "aaa . aaa"

我想验证一个字符串,当点“.”的前面或后面有“-”或“ux”时,正则表达式不应匹配


我认为消极的前瞻是最好的方法,但我似乎做得不对

您可以基于使用此正则表达式,该正则表达式将拒绝匹配前面有
-
或后面有
-
的点

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

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

PS C:\Users\user>$reg=“^.*(您可以基于使用此正则表达式,该正则表达式将拒绝匹配前面有
-
或后面有
-
的点

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

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

PS C:\Users\user>$reg=“^.*(您不一定需要环顾四周,
直接使用否定字符类也可以:

$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

您不必四处张望,
直接使用否定字符类也可以:

$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


这将强制最小字符串长度至少为3个字符,因为它与
a.
不匹配,因为dot后面或前面没有
.
-
@PushpeshKumarRajwanshi,这是一个很好的观点。因此,这取决于OPs未知用例,我的RE是否适用。负面外观在这种情况下,他们不需要更多的字符出现(不像积极展望或简单的其他字符)相反,只需说,什么不应该存在,它有助于保持有效字符串长度最小。@PushpeshKumarRajwanshi我自己经常使用它们,并引用非常相同的站点链接:数据这将强制最小字符串长度至少为3个字符,因此它将不匹配
a.
在应该匹配的位置,因为点不匹配后面或前面有
\uu
-
@PushpeshKumarRajwanshi,这是一个很好的观点。因此,这取决于OPs未知用例,我的RE是否适用。在这种情况下,负面注视头很好,因为它们不需要更多字符(与正面注视或其他字符不同)相反,只要说,什么不应该存在,它有助于保持有效字符串长度最小。@PushpeshKumarRajwanshi我自己经常使用它们,并引用非常相同的站点链接:D@Glenn:这是一个有点复杂的正则表达式。你有什么问题吗?@Glenn:当然,这很简单。你只需要加上这个消极的前瞻
(?!.*(:-\.\124;\.-))
@
之后,在当前正则表达式中添加
-
以拒绝字符串。如果您还需要其他内容,请告诉我。@Glenn:当然,我可以删除可避免的内容并使其尽可能紧凑。@Glenn:我通过删除一些不必要的外观标题缩短了您的正则表达式。B但它仍然可以进一步改进,因为我觉得它有太多的负面外观,可以组合并改进。如果你能给我接受匹配和拒绝匹配的规则和样本数据。我可以提出你需要的精确简洁的正则表达式。我建议用一些等价的方法删除所有敏感信息保留格式的nt字符,然后您可以通过我的skype id与我联系
pkr555
@Glenn:这是一个有点复杂的正则表达式。您对此有什么问题吗?@Glenn:当然,这很简单。您只需添加此负面前瞻
(?!*(:-\。\124;-)
@
之后,在当前正则表达式中添加
-
以拒绝字符串。如果您还需要其他内容,请告诉我。@Glenn:当然,我可以删除可避免的内容并使其尽可能紧凑。@Glenn:我通过删除一些不必要的外观标题缩短了您的正则表达式。B但它仍然可以进一步改进,因为我觉得它有太多的负面外观,可以组合并改进。如果你能给我接受匹配和拒绝匹配的规则和样本数据。我可以提出你需要的精确简洁的正则表达式。我建议用一些等价的方法删除所有敏感信息保留格式的nt字符,然后您可以通过我的skype id与我联系
pkr555