正则表达式替换不匹配

时间:2014-11-26 18:46:50

标签: regex powershell regex-negation

我试图写一个正则表达式来删除任何不是十六进制字符或逗号的内容。

我有以下代码:

$hex = "hex:68,65,6C,6C,6F,\
  73,74,61,63,6B,6F,76,65,72,66,6C,6F,77,\
  72,65,68,65,78,70,65,72,74,73"

#remove superfluous characters
$hex = $hex -replace "[0-9A-F]{2}|,",""
Write-Output $hex

其中给出了以下输出:

hex:\
  \

我喜欢相反的方式(即删除上面显示的字符,并保留以前删除的字符)。我知道[^ 模式 ]否定了一种模式;但是到目前为止,我还没有成功地与理论相提并论,当你处理完整模式而不是单个字符时,这个理论可以解决这个问题...... < / p>

期望的输出:

68,65,6C,6C,6F,73,74,61,63,6B,6F,76,65,72,66,6C,6F,77,72,65,68,65,78,70,65,72,74,73

正则表达式101: http://regex101.com/r/xJ3yU6/1

到目前为止的尝试:

  • [^ [0-9A-F] {2},?]
  • [^(?:[0-9A-F] {2})?,]
  • [^(?:[0-9A-F] {2})] [^,]
  • [^(?:[0-9A-F] {2} |)]
  • [^(?:?[0-9A-F] {2},)]
  • [^ 0-9A-F] {2} [^ ,?]
  • 各种其他人越来越有效/太可耻而要发帖。

注意:如果有一个好的PowerShell解决方案而不是正则表达式解决方案,我也会感兴趣;虽然我怀疑正则表达式会更优雅。

3 个答案:

答案 0 :(得分:2)

我不得不环顾四周。你不能轻易地用替换来做到这一点,除非你使用捕获组来做到这一点,这不会产生你正在追求的东西......

$hex = "hex:68,65,6C,6C,6F,\
  73,74,61,63,6B,6F,76,65,72,66,6C,6F,77,\
  72,65,68,65,78,70,65,72,74,73"

$hex = $hex -replace "hex:((?:[a-f0-9]{2},?)*).*", '$1'
Write-Output $hex

通过选择要保留的内容

可以更好地工作
$hex = "hex:68,65,6C,6C,6F,\
  73,74,61,63,6B,6F,76,65,72,66,6C,6F,77,\
  72,65,68,65,78,70,65,72,74,73"

$hex = ($hex | select-string -allmatches "(?<=[:,](\\\s*)?)[a-f0-9]{2}").Matches -join(",")
Write-Output $hex

你的正则表达式101出错的地方是[^regexhere]实际上正在寻找一个不属于这些字符的单个字符:{'r','e','g','x','h'}。它是单个值的占位符,它实际上并不意味着“这个词”,也有一种方法可以做到这一点,但是如果接下来的4个字符是单词(?!hex:),则会更难使用hex: {1}},但实际上并没有抓住它们。我在第二个解决方案中使用了与之相反的方法,其中我说:“任何以,:开头的十六进制数字,但我对{{1}不感兴趣}和,他们自己“。

答案 1 :(得分:1)

就个人而言,我会抓住并保留你想要的所有东西,然后匹配(但没有捕获)所有其他东西:

Search:
([0-9A-F]{2}|,)|.

Replace:
$1

这会让你得到以下结果:

68,65,6C,6C,6F,73,74,61,63,6B,6F,76,65,72,66,6C,6F,77,72,65,68,65,78,70,65,72,74,73

您可以看到此on Regex101。请注意,我使用了s标志,因此.字符也会匹配换行符。

答案 2 :(得分:1)

也许我错过了一些东西,但你为什么不简单地删除你想要的字符串而不是试图删除你想要的一切?

PS C:\> $hex = "hex:68,65,6C,6C,6F,\
>>   73,74,61,63,6B,6F,76,65,72,66,6C,6F,77,\
>>   72,65,68,65,78,70,65,72,74,73"
>>
PS C:\> $hex
hex:68,65,6C,6C,6F,\
  73,74,61,63,6B,6F,76,65,72,66,6C,6F,77,\
  72,65,68,65,78,70,65,72,74,73
PS C:\> $hex -replace '^hex:' -replace '\\\s*'
68,65,6C,6C,6F,73,74,61,63,6B,6F,76,65,72,66,6C,6F,77,72,65,68,65,78,70,65,72,74,73