1
88
如果您正在操作的字符串很长,或者您在许多字符串上操作,那么使用java.util.regex.matcher可能是值得的(这需要提前编译时间,因此,如果您的输入非常小或搜索模式经常更改,则效率不高)。 下面是一个完整的示例,基于从映射中获取的令牌列表。(使用来自apache commons lang的stringutils)。
一旦正则表达式被编译,扫描输入字符串通常非常快(尽管如果正则表达式很复杂或涉及回溯,那么您仍然需要进行基准测试以确认这一点!) |
2
40
算法替换匹配字符串(不使用正则表达式)的最有效方法之一是使用 Aho-Corasick algorithm 带着表演 Trie (发音为“try”),快 hashing 算法,高效 collections 实施。 简单代码
也许最简单的代码可以利用Apache的
这在大文本上会变慢。 快码Bor's implementation 在aho corasick算法中,通过使用具有相同方法签名的fa§ade,引入了一点更复杂的实现细节:
基准对于基准,缓冲区是使用 randomNumeric 如下:
在哪里?
基准代码本身( JMH 似乎杀伤力过大):
100万:1000一个简单的微型基准测试,用1000000个字符和1000个随机放置的字符串替换。
没有竞争。 10000:1000使用10000个字符和1000个匹配字符串替换:
分水岭结束了。 1000:10使用1000个字符和10个匹配字符串替换:
对于短字符串,设置aho corasick的开销使野蛮的武力方法相形见绌。
基于文本长度的混合方法是可能的,以获得两种实现的最佳效果。 启动位置考虑比较超过1 MB的文本的其他实现,包括:
论文与算法有关的论文和信息: |
3
7
如果要多次更改字符串,则通常使用StringBuilder更有效。 (但要衡量你的表现以找出答案) :
每次对字符串执行替换时,都会创建一个新的字符串对象,因为字符串是不可变的。StringBuilder是可变的,也就是说,它可以随意更改。 |
4
4
当然,真正的问题是,这是否是一个过度优化?JVM非常擅长处理多个对象的创建和随后的垃圾收集,和所有优化问题一样,我的第一个问题是您是否测量过这个问题并确定它是一个问题。 |
5
2
用这个怎么样 replaceAll() 方法? |
6
2
Rythm一个Java模板引擎现在发布了一个新的特性 String interpolation mode 它允许您执行以下操作:
上面的案例显示您可以按位置将参数传递给模板。Rythm还允许您按名称传递参数:
注释Rythm非常快,比Strug.Frand和Sturn的速度快大约2到3倍,因为它将模板编译成Java字节码,运行时性能与StringBuilder的连接非常接近。 链接: |
7
2
这对我很有用:
例子:
输出: 苹果香蕉酥- |
8
1
检查一下: string.format(str,str[]) … 例如: string.format(“将您的%s放在您的%s所在的位置”、“money”、“mouth”); |
9
0
|
10
0
以下是基于 Todd Owen's answer . 该解决方案的问题是,如果替换内容包含在正则表达式中具有特殊意义的字符,则可能会得到意外的结果。我还希望能够选择性地进行不区分大小写的搜索。我想到的是:
以下是我的单元测试用例:
|
Dima Malko · 如何在指定符号前添加符号? 2 年前 |
shekharsabale · 从列表元素捕获子字符串 2 年前 |
Manny · 如何比较Perl中的字符串? 2 年前 |
Manan Girdhar · 拆分字符串并仅在java中使用第二部分 2 年前 |
AnxiousLuna · Python使用len()获取数组索引数 2 年前 |
antonoyaro8 · 数据帧中每列上的Grepl 2 年前 |