【问题标题】:Are regular expressions only applicable to Strings?正则表达式是否仅适用于字符串?
【发布时间】:2016-04-07 15:50:00
【问题描述】:

我想知道正则表达式的概念是否仅适用于 Java 中的字符串类型,或者也可以应用于数值。例如:

  • 从整数列表中找出所有大于 x 但 小于 y

  • 从大于 x 的整数列表中查找所有整数

  • 从整数列表中找出小于 (x-10) 的所有整数

这个概念是否也适用于数值,但没有在 Java 中实现,或者对于数值来说实现起来是否太具有挑战性?

据我了解,正则表达式应该适用于任何涉及搜索的地方(无论值类型如何)。


正如答案和 cmets 中所建议的那样,Java 8 的 Stream 在功能上可以满足我的需求(通过过滤器等),但我的问题主要是在 list of regex patterns 中缺少数值的简写形式;例如,如果 > x 作为模式存在,那会更容易。

【问题讨论】:

  • 对于所有这三种情况,您都应该使用比较运算符。要对数值使用正则表达式,您需要先将它们强制转换/强制为 String。换句话说,正则表达式只能用于字符串
  • 听起来你想使用Stream
  • @ElliottFrisch:是的,我简要了解了Stream,这似乎是我正在寻找的。​​span>
  • 大多数时候,反对者不会解释,但我再次问,为什么?我想,我的问题不够清楚,可能是在编辑部分之后。这不是要质疑你的判断,而是要纠正自己。

标签: java regex


【解决方案1】:

正则表达式是一个专门适用于字符串的概念(这不是 Java 特有的)。

听起来你想要的是一个谓词,它是一个接受一个值并返回真或假的函数,因此可用于过滤对象集合。 Java 8 流支持这种过滤,Groovy 可以将过滤器应用于 Java 集合(实际上是任何可迭代的)。

【讨论】:

  • 感谢您的回答,我已经修改了关于好奇心来源的问题。
【解决方案2】:

正则表达式实际上与 finite-state machine 属于同一家族,其想法是您拥有所有已知字符的字母表,并且能够通过表达式本身表示捕获状态。

例如,表达式Colorado License Plate Number [A-Z]{3}-\d{3} 可以捕获许多内容,但它要求字符串“科罗拉多车牌号”是该州的一部分。是的,空间包括在内。

您所代表的表达式没有任何特定于状态的信息;也就是说,他们只检查布尔响应。

  • 从整数列表中找出大于 x 但小于 y 的所有整数

    • 这表示通过列表的过滤操作,给定列表i 的元素,找到x < i < y
  • 从大于 x 的整数列表中查找所有整数

    • 这表示通过列表的过滤操作,给定列表i 的元素,找到i > x

...等等。

这些更好地表示为predicates。 Google Guava 有 an entire class 专用于它们,Java 8 中的 lambda 可以在流中替代它们。

所以,是的,正则表达式真的只适用于字符串。如果您想要更复杂的 FSM,则可以编写一个,但不使用本地正则表达式引擎。

【讨论】:

  • 非常感谢您区分状态和过滤器。提出问题的想法是学习新事物,我想,我做到了。谢谢。
猜你喜欢
  • 2011-10-19
  • 2018-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 2012-11-04
  • 1970-01-01
相关资源
最近更新 更多