【问题标题】:How can I test if '-' exists but NOT between character '[' and ']'?如何测试'-'是否存在但不在字符'['和']'之间?
【发布时间】:2016-07-13 16:02:24
【问题描述】:

如何测试 '-' 是否存在但不在字符 '[' 和 ']' 之间?

例如:

AFR-SADKJ:匹配

safkdsjfs[9-0] :跳过(因为 -exists 但有 [ 之前和之后的某个地方]

你能建议吗? 谢谢!

【问题讨论】:

  • 你有没有尝试过?请注意,.NET 具有无限宽度的后视功能 - 在这里非常方便。您想匹配safkdsjfs[9- 中的连字符吗?

标签: .net regex powershell


【解决方案1】:
-(?![^[]*])

这是工作的DEMO

【讨论】:

  • 中断AFR-SAD]KJ
【解决方案2】:

-notmatch 运算符与匹配方括号之间某处的连字符的正则表达式结合使用:

PS C:\> $re = '\[.*-.*\]'
PS C:\> $s1 = 'AFR-SADKJ'
PS C:\> $s2 = 'safkdsjfs[9-0]'
PS C:\> $s3 = 'foobar'
PS C:\> $s1 -like '*-*' -and $s1 -notmatch $re
True
PS C:\> $s2 -like '*-*' -and $s2 -notmatch $re
False
PS C:\> $s3 -like '*-*' -and $s3 -notmatch $re
False

请注意,您需要进行两项检查才能使其正常工作:一项确认是否存在连字符,另一项检查它是否在方括号之间。否则你会得到不包含连字符的字符串的误报。

如果您经常需要此检查,您可能需要将其包装在一个函数中:

function Test-Hyphen([string]$s) {
  $s -like '*-*' -and $s -notmatch '\[.*-.*\]'
}

【讨论】:

    【解决方案3】:

    试试下面的正则表达式:

    (?!\[.*)-(?!.*\])
    

    Live Demo on Regex101


    它是如何工作的:

    (?!\[.*)    # Do Not match if there is a [ then data
    -           # Hyphen
    (?!.*\])    # Do Not match if there is data then a ]
    

    【讨论】:

    • 中断AFR-SAD]KJ
    猜你喜欢
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 2012-04-25
    相关资源
    最近更新 更多