我有一个文本,其中我只想获得十六进制代码。 喜欢:" thisissometextthisistext \ x64 \ x6f \ x6e \ x74 \ x74 \ x72 \ x61 \ x6e \ x73 \ x6c \ x61 \ x74 \ x65someomemoretextoverhere"
可以使用 \ x .. 获取十六进制代码 但似乎我不能像(^ \ x ..)那样选择所有但十六进制代码。
有任何解决方法吗?
答案 0 :(得分:3)
您可以使用(?s)((?:\\x[a-fA-F0-9]{2})+)|.
正则表达式(将匹配并捕获到第1组中的任何1 +十六进制值序列,或者只匹配包括换行符的任何其他字符)并替换为条件替换模式{ {1}}(将重新插入十六进制值链或将匹配替换为空字符串):
查找内容:(?{1}$1\n:)
替换为:(?s)((?:\\x[a-fA-F0-9]{2})+)|.
正则表达式详细信息:
(?{1}$1\n:)
- 与 (?s)
相同,与新行选项相匹配.
- 第1组捕获一个或多个序列
((?:\\x[a-fA-F0-9]{2})+)
- \\x
\\x
- 从[a-fA-F0-9]{2}
到a
或数字f
- 或|
- 任何一个字符。替换模式:
.
- 如果第1组匹配:
(?{1}
- 替换为其内容+换行符$1\n
- 其他用空字符串替换:
- 替换模式结束。答案 1 :(得分:1)
答案 2 :(得分:0)
如果您已经能够使用正则表达式找到十六进制代码,那么您是否只能使用该信息从字符串中删除所有十六进制代码(如果需要保留原始代码,则从字符串的克隆中删除)和除了十六进制代码之外,你将留下所有文本。
答案 3 :(得分:0)
^
仅作为字符类内部(和开头)的否定标记,不能用它来否定多个字符的子字符串。
要选择不是\xhh
的所有内容,您可以使用此模式:
\G(?:\\x[a-f0-9]{2})*+\K(?=.|\n)[^\\]*(?:\\(?!x[a-f0-9]{2})[^\\]*)*
它首先与\xhh
匹配,然后使用\K
功能将其从匹配项中删除(删除左侧的全部内容)。模式的另一部分[^\\]*(?:\\(?!x[a-f0-9]{2})[^\\]*)*
匹配所有不是\xhh
的部分。由于此子模式可以匹配字符串末尾的空字符串,因此我添加了前瞻(?=.|\n)
以确保至少有一个字符。
\G
强制所有比赛都是有争议的。换句话说,它匹配上一场比赛结束时的位置。