|
|
1
88
如果您正在操作的字符串很长,或者您正在操作许多字符串,那么使用java.util.regex可能是值得的。匹配器(这需要预先编译时间,因此如果您的输入非常小或您的搜索模式频繁更改,则效率不高)。 下面是一个完整的示例,基于从地图上获取的令牌列表。(使用Apache Commons Lang的StringUtils)。
一旦编译了正则表达式,扫描输入字符串通常非常快(尽管如果你的正则表达式很复杂或涉及回溯,那么你仍然需要进行基准测试来确认这一点!) |
|
|
2
40
替换匹配字符串(没有正则表达式)的最有效方法之一是使用 Aho-Corasick algorithm 与表演 Trie (发音为“try”),快速 hashing 算法,高效 collections 实施。 简单代码
一个简单的解决方案利用了Apache的
这会减慢大文本的速度。 Bor's implementation Aho-Corasick算法引入了更多的复杂性,通过使用具有相同方法签名的外观成为实现细节:
基准测试对于基准测试,缓冲区是使用 randomNumeric 如下:
哪里
JMH 似乎有些过头了):
1,000,000 : 1,000一个简单的微基准测试,包含1000000个字符和1000个随机放置的字符串进行替换。
没有竞争。 10,000 : 1,000
分歧结束了。 1,000 : 10使用1000个字符和10个匹配字符串替换:
对于短字符串,设置Aho Corasick的开销超过了暴力方法
实现考虑比较长度超过1 MB的文本的其他实现,包括:
论文与算法相关的论文和信息: |
|
|
3
7
这对我奏效了:
例子:
输出: 苹果香蕉果- |
|
|
4
4
如果你要多次更改一个String,那么使用StringBuilder通常会更有效 (但要衡量你的表现才能发现) :
每次对String进行替换时,都会创建一个新的String对象,因为String是不可变的。StringBuilder是可变的,也就是说,它可以随意更改。 |
|
|
5
2
当然,真正的问题是,这种优化是否太过分了?JVM非常擅长处理多个对象的创建和随后的垃圾收集,就像所有优化问题一样,我的第一个问题是,你是否已经衡量过这一点并确定这是一个问题。 |
|
|
6
2
检查这个:
例如:
|
|
|
7
2
Rythm是一个java模板引擎,现在发布了一个名为 String interpolation mode 它允许您执行以下操作:
上面的例子表明,您可以按位置将参数传递给模板。Rythm还允许您按名称传递参数:
注意:Rythm非常快,比String.format和velocity快2到3倍,因为它将模板编译成java字节码,运行时性能非常接近StringBuilder。 链接: |
|
|
8
1
以下内容基于 Todd Owen's answer 该解决方案存在一个问题,即如果替换包含在正则表达式中具有特殊含义的字符,则可能会得到意外的结果。我还希望能够选择性地进行不区分大小写的搜索。以下是我的想法:
以下是我的单元测试用例:
|
|
|
9
0
如何使用 replaceAll() 方法? |
|
|
10
0
|
|
Ben · 统计向量中的单词在字符串中出现的频率 1 年前 |
|
|
bear_525 · 从列中删除中间名和首字母,并保存在单独的列中 1 年前 |
|
|
asdfadf · 为什么具有相同内存值的字符串和整数打印方式不同? 1 年前 |
|
|
user764754 · 防止多行原始字符串文字中出现新行字符 1 年前 |
|
|
Bogaso · 从列表中返回与模式匹配的元素 1 年前 |
|
|
Jasco · 如何使用VBA提取两个相似字符之间的字符串中的单词? 1 年前 |