【问题标题】:Applying a regular expression to a Java I/O Stream [closed]将正则表达式应用于 Java I/O 流 [关闭]
【发布时间】:2010-10-17 13:05:36
【问题描述】:

我寻求一个将正则表达式应用于 Java I/O 流的示例,它不会像我想保留二进制数据那样简单地将流转换为字符串。网上的例子多集中在文本数据上……

【问题讨论】:

  • 你想做什么?拒绝与正则表达式不匹配的数据?如果您对字符串不感兴趣,您想匹配什么?一些澄清会很好
  • 只是为了澄清:转换为字符并返回二进制数据可能会对性能产生影响,但不会因为转换而丢失一个字节。

标签: java regex sockets network-programming stream


【解决方案1】:

将流转换为字节数组。

【讨论】:

  • 应该提到的是,只有当输入的大小和加载所需的时间都可以加载到内存中时,这才有意义!这意味着您需要知道流提供的数据的长度才能编写可靠的程序。知道流的输入长度与其提供可能无穷无尽的数据的目的相矛盾!
【解决方案2】:

必须对字符串执行正则表达式操作,字符串是二进制数据的编码字节。您无法对不知道它们代表什么的数据字节执行正则表达式操作。

【讨论】:

  • -1 我不同意。没有理由不能将正则表达式应用于二进制数据。二进制数据并不意味着您不知道它们代表什么。
  • 假设您可以获取 0 和 1 的流并对其执行正则表达式。但是,现有的 Java API 都不能让您在不将其转换为更有意义的东西的情况下访问该原始流。
  • +1 同意,对二进制数据应用正则表达式没有意义。正则表达式从根本上面向字符串,它们是使用字符串定义的,因此您将始终使用字符串编码,无论是显式还是隐式。
  • 我不会投赞成票或反对票,但假设您有一个像 ASN.1 或 Java 序列化这样的“二进制”协议。在这样的字节串中查找正则表达式是有意义的。
  • 二进制数据的某些部分可能会巧合地匹配您的正则表达式。在这种情况下,您最终可能会进行虚假匹配或损坏二进制数据。根据您的主题数据和正则表达式,您也许可以放弃这些顾虑。但在一般情况下,二进制数据可能包含实际上并不代表字符串的字符串,这意味着存在错误匹配的风险。这就是为什么最好先分离数据,以及为什么不存在真正通用的解决方案。话虽如此,我还是赞成另一个答案,因为它对 OP 的帮助更大。 ;)
【解决方案3】:

Java 标准中没有所需的功能。您将不得不使用jakarta regexp,特别是StreamCharacterIterator 类。该类封装了一个 InputStream 用于正则表达式操作。

如果您想使用标准的正则表达式包,我建议从上一个类here 中获取源并通过实现CharSequence 而不是CharacterIterator 来更改合同。

【讨论】:

  • 实现 CharSequence 的一个问题是接口要求类实现“public int length()”。如果您从流中读取,那么您将不知道长度并且无法将答案返回给正则表达式引擎。
【解决方案4】:

尝试使用Ragel - 带有转换回调的正则表达式工具。

可以应用于流和块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-27
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    • 2017-09-10
    相关资源
    最近更新 更多