regex 在.net中可以将正则表达式与二进制数据进行匹配吗?

uajslkp6  于 2023-08-08  发布在  .NET
关注(0)|答案(5)|浏览(150)

我知道我可以使用正则表达式来匹配字符串中的子字符串,但是是否可以使用正则表达式来匹配二进制数据中的某些模式?如果是这样,那么二进制数据应该是什么格式--二进制数组、流还是其他格式?

编辑:

好解释我有二进制数据,不应该有一些字符串内,但数据本身是二进制的,所以我需要检测这种模式的数据,所以我标记为无效的数据。
但是我不能把这个二进制数据转换成字符串,因为它是无效的。也许只是一些char[]之类的东西。

编辑:

现在我在想,也许可以将二进制数据转换为基本编码(有什么提示吗?当然不是unicode,我想是ascii。),然后我将使用正则表达式。
但是问题是我是否能够使用这种编码将任何二进制数据转换为字符串,或者我将遇到一些无效的情况,并且在将二进制数据转换为字符串时会导致异常。

6pp0gazn

6pp0gazn1#

从技术上讲,你的问题的答案是“是的”,因为你可以把二进制数据当作一个特定编码的字符串,但我不相信这是你要问的。
如果你问是否有一个库可以对一个字节数组进行模式匹配,那么.NET正则表达式系统不会这样做,而且我也不知道有这样的库。

dpiehjr4

dpiehjr42#

是的,这是可能的,但你为什么要这样做?当然,首先需要将数据编码为字符串,但如果要这样做,为什么不简单地将数据反序列化为更合理的数据结构呢?
正则表达式只用于匹配字符串-如果有二进制数据,那么你可以很肯定正则表达式是错误的解决方案。

nwsw7zdq

nwsw7zdq3#

我还没有尝试过,但我敢打赌,你可以把你的二进制数据转换成base64字符串,然后使用正则表达式来查找你的搜索字符串--当然,你也必须用base64编码你的搜索字符串。

qv7cva1a

qv7cva1a4#

Perl能够匹配纯二进制数据。而且我认为这应该是可能的与大多数其他品牌。
您可以使用缩写'\xNN'来搜索十六进制形式的特定字节。因此,即使像'[\x20-\xff]'这样的字符类也是可能的。

mtb9vblg

mtb9vblg5#

可以将byte[]与模式进行匹配。将字符串转换为byte[]会丢失字符,但不会丢失长度。因此,使用这个公式,我从Match中获得了IndexValue.Length,然后在这个扩展中子数组byte[]。

using System.Diagnostics.CodeAnalysis;
using System.Text;
using System.Text.RegularExpressions;

public static class RegexByteArrayMatcher
{
    public static List<byte[]> Matches(this byte[] input, [StringSyntax(StringSyntaxAttribute.Regex)] string pattern, RegexOptions regexOptions = RegexOptions.None) =>
        Regex.Matches(Encoding.UTF8.GetString(input), pattern, regexOptions).ToArray().Select(m => input.Skip(m.Index).Take(m.Length).ToArray()).ToList();
    public static List<byte[]> Matches(this byte[] input, [StringSyntax(StringSyntaxAttribute.Regex)] byte[] pattern) => input.Matches(Encoding.UTF8.GetString(pattern));
    public static bool IsMatch(this byte[] input, [StringSyntax(StringSyntaxAttribute.Regex)] string pattern, RegexOptions regexOptions = RegexOptions.None) =>
        Regex.IsMatch(Encoding.UTF8.GetString(input), pattern, regexOptions);
    public static bool IsMatch(this byte[] input, [StringSyntax(StringSyntaxAttribute.Regex)] byte[] pattern) => input.IsMatch(Encoding.UTF8.GetString(pattern));
    public static List<byte[]> Matches(this Regex regex, byte[] input) =>
        regex.Matches(Encoding.UTF8.GetString(input)).ToArray().Select(m => input.Skip(m.Index).Take(m.Length).ToArray()).ToList();
    public static bool IsMatch(this Regex regex, byte[] input) => regex.IsMatch(Encoding.UTF8.GetString(input));
}

字符串

相关问题