使用正则表达式处理字符串,还是不使用正则表达式处理字符串?

6
我已经开始在我的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脚本,在那里正则表达式只是“最宽松意义上的字符串”,并且没有分离的类的必要/需要,因此我很难看出这里有何区别。


2
永远不要写new String("...");。只需使用"..."String regexString = ".*";。显式创建新的String对象是不必要且低效的。 - Jesper
无论我怎么做,对象不是总会被创建吗?如果我有几个单独的字符串会怎样? - AncientSwordRage
3
是的,如果你只是使用一个字面量,比如 ".*",那么就会创建一个 String 对象。但是如果你使用 new String(".*"),就会创建第二个 String 对象,这个对象复制了字面字符串的内容,这是不必要的。在Java中,字符串是不可变的。Java有一个字符串池机制,所以如果你多次使用相同的字符串字面量,将只有一个被共享的 String 对象。 - Jesper
2个回答

7

我会按照你认为最简单和最清晰的方式进行操作。

当正则表达式的性能至关重要时,通常会使用Pattern。如果您尚未对应用程序进行过分析,并且已经显示出问题,则使用普通的String可能是可以接受的。


我意识到的一件事是,你只能使用字符串进行match,而不能使用find,这是我想要做到的。 - AncientSwordRage
1
你可以使用 match(".*"+regex+".*"); 代替 find。 - Peter Lawrey

0
你正在尝试使用用于匹配的正则表达式必须转换为接受与提供的模式匹配的任何文本的有限状态机。
因此,每次使用正则表达式时,例如在(new String("").split("")表达式中,将在后台构造一个模式,即有限状态机,该模式接收您的字符串中的字符序列并尝试进行匹配。
如果您经常使用某个正则表达式且速度是真正的关注点,则保留有限状态机而不是每次构造它是重要的加速。您可以通过在不同输出字符串的连续调用匹配之间存储Pattern对象来实现。
以下应提供更多见解:http://en.wikipedia.org/wiki/Finite-state_machine

我不明白将一个被转换为存储的模式初始化的字符串与从字符串初始化并存储的模式有什么区别。 - AncientSwordRage

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接