【问题标题】:To regex with a string or to not regex with a string?使用字符串进行正则表达式还是不使用字符串进行正则表达式?
【发布时间】:2012-10-03 08:13:00
【问题描述】:

我已经开始在我的 java 程序中使用 .match(Regex) 方法,但现在我只是使用一个字符串(String regexString = new String("[^a-zA-Z0-9][^a-zA-Z0-9]*"); 是我目前所拥有的,例如)。但是我知道我可以使用实际的正则表达式(Regex pattern = new Regex() & the Pattern class 然后编译它(?)以某种方式)。

在java中使用Regex作为一个类而不仅仅是一个字符串有什么好处吗?我非常习惯于 bash 脚本,并且正则表达式只是最松散意义上的“字符串”,并且没有能力/不需要单独的类,所以我很难看到这里有一个。

【问题讨论】:

  • 永远不要写new String("...");。只需使用"..." 代替:String regexString = ".*";。显式创建一个新的String 对象是不必要且低效的。
  • 无论如何我都不会创建一个对象吗?如果我有几个单独的字符串怎么办?
  • 是的,如果您只使用文字,例如".*",则会创建一个String 对象。但是,如果您执行new String(".*"),则会创建第二个String 对象,该对象复制文字字符串的内容,这是不必要的。字符串在 Java 中是不可变的。 Java有一个字符串池机制,所以如果你多次使用同一个字符串字面量,只有一个String对象是共享的。

标签: java regex string


【解决方案1】:

我会做你认为最简单、最清晰的事情。

Pattern 通常在正则表达式的性能至关重要时使用。如果您尚未分析您的应用程序并且它已被证明是一个问题,那么使用普通的 String 可能没问题。

【讨论】:

  • 我所依赖的一件事是,您只能使用字符串 match,而不能使用 find,这是我希望能够做到的。
  • 你可以match(".*"+regex+".*");而不是find。
【解决方案2】:

您尝试用于匹配目的的正则表达式必须在一个有限状态机中进行转换,该状态机接受与您提供的模式匹配的任何文本。

因此,每次使用正则表达式时,例如在 (new String("").split("") 表达式中,都会在后台构造一个模式,即有限状态机,它接收序列字符串中的字符数并尝试匹配输入。

如果您有一个经常使用的正则表达式并且速度是一个真正的问题,那么保持有限状态机而不是每次都构建它是一个重要的加速。您可以通过在不同输出字符串上连续调用 match 之间存储 Pattern 对象来做到这一点。

以下内容应该提供更多见解:http://en.wikipedia.org/wiki/Finite-state_machine

【讨论】:

  • 我看不出初始化一个转换成存储模式的字符串与从字符串初始化并存储的模式有什么不同...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多