不能用 ^ 说“all but”

Can't use ^ to say "all but"

提问人:FireBlast 提问时间:7/10/2017 更新时间:7/10/2017 访问量:128

问:

我有一个文本,我只想获取十六进制代码。 比如:“thisissometextthisistext\x64\x6f\x6e\x74\x74\x72\x61\x6e\x73\x6c\x61\x74\x65somemoretextoverhere”

可以使用 \x 获取十六进制代码。但似乎我不能做类似 (^\x..) 的事情来选择除十六进制代码之外的所有内容。

有什么解决方法吗?

正则表达式 记事本++

评论

1赞 Wiktor Stribiżew 7/10/2017
尝试正则表达式和替换。(?s)((?:\\x[a-fA-F0-9]{2})+)|.(?1$1\n:)

答:

0赞 bitwitch 7/10/2017 #1

如果你已经能够找到带有正则表达式的十六进制码,那么你不能使用这些信息从字符串中删除所有十六进制码吗(如果你需要保留原始字符串,也可以从字符串的克隆中删除),你将留下除十六进制码之外的所有文本。

评论

0赞 Keith Nicholas 7/10/2017
他想要十六进制代码并摆脱其他东西
1赞 Keith Nicholas 7/10/2017 #2

尝试并替换为^.*?((\\x[a-f0-9]{2})+).*$$1

它应该只留下十六进制代码

enter image description here

然后在更换后

enter image description here

0赞 Casimir et Hippolyte 7/10/2017 #3

^仅在字符类内部(和开头)充当否定标记,不能使用它来否定多个字符的子字符串。

若要选择所有未选择的内容,可以使用以下模式:\xhh

\G(?:\\x[a-f0-9]{2})*+\K(?=.|\n)[^\\]*(?:\\(?!x[a-f0-9]{2})[^\\]*)*

它首先匹配 s,并使用功能将它们从匹配中删除(删除左侧的所有)。模式的另一部分匹配所有不是 .由于此子模式可以匹配字符串末尾的空字符串,因此我添加了 lookahead 以确保至少有一个字符。 强制所有匹配项连续进行。换句话说,它与上一场比赛结束时的位置相匹配。\xhh\K[^\\]*(?:\\(?!x[a-f0-9]{2})[^\\]*)*\xhh(?=.|\n)\G

3赞 Wiktor Stribiżew 7/10/2017 #4

您可以使用正则表达式(将匹配并捕获十六进制值的任何 1+ 序列到第 1 组中,或者仅匹配任何其他字符,包括换行符字符)并替换为条件替换模式(将重新插入十六进制值链或将匹配项替换为空字符串):(?s)((?:\\x[a-fA-F0-9]{2})+)|.(?{1}$1\n:)

查找内容替换为
(?s)((?:\\x[a-fA-F0-9]{2})+)|.(?{1}$1\n:)

enter image description here

正则表达式详细信息

  • (?s)- 与 相同。 匹配换行符选项 ON
  • ((?:\\x[a-fA-F0-9]{2})+)- 第 1 组捕获一个或多个序列
    • \\x-一个\\x
    • [a-fA-F0-9]{2}- 2 个字母,从 to 或数字af
  • |-或
  • .- 任何单个字符。

更换模式

  • (?{1}- 如果第 1 组匹配:
    • $1\n- 替换为其内容 + 换行符
    • :- else 替换为空字符串
  • )- 替换模式的结束。

评论

0赞 FireBlast 7/11/2017
谢谢它运行良好,我只是用 \1 代替
0赞 Wiktor Stribiżew 7/11/2017
在 Notepad++ 中,等于 .\1$1