Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将代码改进为replaceAll字符串

将代码改进为replaceAll字符串
EN

Stack Overflow用户
提问于 2014-10-15 03:05:23
回答 3查看 206关注 0票数 0

有没有其他方法可以更有效地使用尽可能少的内存来更有效地执行“replaceAll”呢?

代码语言:javascript
运行
AI代码解释
复制
 public static String cleanWordTags(String source) {

    String copy = source;

    copy = copy.replaceAll("<P style=\"M[^>]*>", "<P>");
    copy = copy.replaceAll("<p style=\"M[^>]*>", "<p>");
    copy = copy.replaceAll("<p style=\"T[^>]*>", "<p>");

    copy = copy.replaceAll("<b style=[^>]*>", "<b>");

    copy = copy.replaceAll("<span class=\"M[^>]*>", "<span>");
    copy = copy.replaceAll("<span style='m[^>]*>", "<span>");
    copy = copy.replaceAll("<span style=\"f[^>]*>", "<span>");
    copy = copy.replaceAll("<span lang[^>]*>", "<span>");
    copy = copy.replaceAll("<span style=\"color[^>]*>", "<span>");
    copy = copy.replaceAll("<span style=\"m[^>]*>", "<span>");
    copy = copy.replaceAll("<span style=\"line[^>]*>", "<span>");
    copy = copy.replaceAll("<span style=\"L[^>]*>", "<span>");
    copy = copy.replaceAll("<span style=\"T[^>]*>", "<span>");
    copy = copy.replaceAll("<span style=\"t[^>]*>", "<span>");

    copy = copy.replaceAll("<br [^>]*>", "<br/>");

    copy = copy.replaceAll("<i style=[^>]*>", "");
    copy = copy.replaceAll("</i>", "");

    copy = copy.replaceAll("<st1:personname[^>]*>", "");
    copy = copy.replaceAll("</st1:personname>", "");

    copy = copy.replaceAll("<st1:metricconverter[^>]*>", "");
    copy = copy.replaceAll("</st1:metricconverter>", "");

    copy = copy.replaceAll("<br[^>]*>", "<br/>");

    copy = copy.replaceAll("<\\W\\Wendif\\W\\W\\W>", "");

    copy = copy.replaceAll("<![^>]*>", "");


    copy = copy.replaceAll("<[vowm]:[^>]*>", "");
    copy = copy.replaceAll("</[vowm]:[^>]*>", ""); //&

    copy = copy.replaceAll("&(amp|lt|gt);", "");
    copy = copy.replaceAll("&nbsp;", "");

    copy = copy.replaceAll("<img width[^>]*>", "");
    copy = copy.replaceAll("<img src=\"file:[^>]*>", "");


    return copy;
}

我发现我可以使用StringUtils.replace而不是replaceAll,但这只适用于没有正则表达式的字符串。

谢谢!

新的:

我尝试使用与注释相关的下一段代码,但替换相同的字符串需要花费5倍的时间:

代码语言:javascript
运行
AI代码解释
复制
 public static String cleanWordTags(String source) {
        String copy = source;

        long t0 = System.currentTimeMillis();

        String regex = "";

        regex += "(align=\"left\")";
        regex += "|(<mce:style>)";
        regex += "|(<i>)";
        regex += "|(<i style=[^>]*>)";
        regex += "|(</i>)";
        regex += "|(<st1:personname[^>]*>)";
        regex += "|(</st1:personname>)";
        regex += "|(<st1:metricconverter[^>]*>)";
        regex += "|(</st1:metricconverter>)";
        regex += "|(<\\W\\Wendif\\W\\W\\W>)";
        regex += "|(<![^>]*>)";
        regex += "|(<[vowm]:[^>]*>)";
        regex += "|(</[vowm]:[^>]*>)";
        regex += "|(&(amp|lt|gt);)";
        regex += "|(&nbsp;)";

        regex += "|(<img width[^>]*>)";
        regex += "|(<img src=\"file:[^>]*>)";

        Pattern p = Pattern.compile(regex);
        copy = p.matcher(copy.toUpperCase()).replaceAll("");

        regex = "";
        regex += "(<span style=\"t[^>]*>)";
        regex += "|(<span style=\"T[^>]*>)";
        regex += "|(<span style=\"L[^>]*>)";
        regex += "|(<span style=\"line[^>]*>)";
        regex += "|(<span style=\"m[^>]*>)";
        regex += "|(<span style=\"color[^>]*>)";
        regex += "|(<span lang[^>]*>)";
        regex += "|(<span style=\"f[^>]*>)";
        regex += "|(<span style='m[^>]*>)";
        regex += "|(<span class=\"M[^>]*>)";

        p = Pattern.compile(regex);
        copy = p.matcher(copy.toUpperCase()).replaceAll("");

        copy = copy.replaceAll("<br[^>]*>", "<br/>");

        //Sustituir
        //        copy = copy.replaceAll("<p class=[^>]*>", "<p>");
        //  copy = copy.replaceAll("<p align=[^>]*>", "<p>");
        copy = copy.replaceAll("<P style=\"M[^>]*>", "<P>");
        copy = copy.replaceAll("<p style=\"M[^>]*>", "<p>");
        copy = copy.replaceAll("<p style=\"T[^>]*>", "<p>");
        copy = copy.replaceAll("<b style=[^>]*>", "<b>");

        System.out.println(System.currentTimeMillis() - t0);

        return copy;
    }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-10-17 04:32:13

最后,我找到的唯一解决方案是将所有没有regex的"replaceAll“替换为”替换“,并尝试泛化正则表达式。

非常感谢!

票数 0
EN

Stack Overflow用户

发布于 2014-10-15 03:46:09

您是否已经看过流传单(参见:https://code.google.com/p/streamflyer/),尽管我不能说明性能方面的任何内容,但它们声明:“修改流中的字符--应用正则表达式,修复XML文档,无论您想做什么。”

此外还有streamflyer-regex-fast (参见:https://code.google.com/p/streamflyer-regex-fast/),它“提供了一个比streamflyer使用的算法更快的算法来匹配字符流上的正则表达式”。

因此,如果您的数据可用为Reader,例如StringReader,您可以很容易地将该示例从首页应用到代码中,如下所示:

代码语言:javascript
运行
AI代码解释
复制
Reader reader = new StringReader("source <p style=\"Memphis\">");
FastRegexModifier modifier = new FastRegexModifier("<P style=\"M[^>]*>", Pattern.CASE_INSENSITIVE, "<P>");
ModifyingReader modifyingReader = new ModifyingReader(reader, modifier);
String result = IOUtils.toString(modifyingReader);

这具有可以使用CASE_INSENSITIVE标志的优点,这可能减少了需要定义的规则的数量。但请注意:这也可能影响性能,因此您应该评估这两种可能性。

如果此解决方案有助于提高您的性能,请报告。

票数 0
EN

Stack Overflow用户

发布于 2014-10-15 05:03:11

即使您想使用regexes,这种方式也是非常低效率的,因为您一次又一次地搜索整个字符串(并创建大量垃圾)。正确的方法是在类似于Matcher的循环中使用这一个进行迭代。

只要让你匹配所有可能感兴趣的东西,并分支于它所发现的。你的模式可能是

代码语言:javascript
运行
AI代码解释
复制
(?:<(p|b|span|br|i|st1:personname|st1:metricconverter|\\W\\Wendif\\W\\W\\W|!|vowm:|img))[^>]+>)|&(amp|lt|gt|nbsp);

它比您想要的更匹配,但在这种情况下可以将替换设置为$0。它只需要一次穿过整个字符串。你可能想做两次传球,而不是保持简单。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26380982

复制
相关文章
spark-shell --master yarn-client(异常已经解决)
可能是spark-shell --master yarn-client过时了,但是换成spark-shell --master yarn --deploy-mode client,依然报错。
程裕强
2022/05/06
1.3K0
spark-shell --master yarn-client(异常已经解决)
7.4.2 程序中断方式
程序中断是指在计算机执行现行程序的过场中,出现某些急需处理的异常情况或特殊请求,CPU暂停中断现行程序,而专区对这些异常情况或特殊情况进行处理,在处理完毕后CPU又自动返回到现行程序的断点处,继续执行原程序。
week
2018/08/24
1.3K0
以编程方式创建Vue.js组件实例
最近参与了一个Vue.js项目,项目中需要能够以编程方式创建组件。通过编程,意思是使用JavaScript创建和插入组件,而无需在模板中编写任何内容。
前端知否
2020/03/23
7.9K3
常见编程语言对REPL支持情况小结
最近跟一个朋友聊起编程语言的一些特性,他有个言论让我略有所思:“不能REPL的都是渣”。当然这个观点有点偏激,但我们可以探究一下,我们常用的编程语言里面,哪些支持REPL,哪些不支持,还有REPL的一些概况。 在一般的脚本语言中,有REPL是常态, 因为REPL非常的方便。 编程术语 REPL (Read-Eval-Print Loop) 中文的话有翻译成“交互式解释器”或“交互式编程环境”的。 不过我觉得不用翻译,直接REPL就好了,这样的术语,翻译成中文后,读者更难理解。下面是对 REPL 的解
Albert陈凯
2018/04/04
1.6K0
以编程方式执行Spark SQL查询的两种实现方式
摘 要 在自定义的程序中编写Spark SQL查询程序 1.通过反射推断Schema package com.itunic.sql import org.apache.spark.sql.SQLContext import org.apache.spark.{SparkConf, SparkContext} /**   * Created by itunic.com on 2017/1/2.   * Spark SQL   * 通过反射推断Schema   * by me:   * 我本沉默是关注互联
天策
2018/06/22
2K0
REPL介绍
REPL介绍 REPL 全称: Read-Eval-Print-Loop(交互式解释器) R 读取 - 读取用户输入,解析输入了Javascript 数据结构并存储在内存中。 E 执行 - 执行输入的数据结构 P 打印 - 输出结果 L 循环 - 循环操作以上步骤直到用户两次按下 ctrl-c 按钮退出。 在REPL中编写程序 (类似于浏览器开发人员工具中的控制台功能) 直接在控制台输入 node 命令进入 REPL 环境 按两次 Control + C 退出REPL界面 或者 输入 .exit 退出 RE
eadela
2020/02/12
1K0
redis的repl-ping-slave-period和repl-ping-replica-period
网上很多Redis方面的文章,会涉及到repl-ping-slave-period和repl-ping-replica-period这两个重要参数,从一些中文解释来看,意思差不多,即:SLAVE周期性的ping MASTER间隔,可直接理解成SLAVE -> MASTER间的心跳间隔(注意箭头方向)。
一见
2019/03/14
1.5K0
REPL是什么
REPL(Read Eval Print Loop:交互式解释器)提供了一个CLI(command-line interface:命令行界面)下读取值、求值、输出值、循环代码的环境。
gojam
2019/05/14
2.7K0
并发编程之线程中断interrupt
线程中断可能在平时的开发中我们用的不多,但是我相信大部分都见过InterruptedException,因为不管我们在调用object.wait()还是Thread.sleep()都会抛出一个InterruptedException。可能有很多人都是直接的继续抛出去或者不做任何处理直接打印堆栈信息,当然有可能这样没有问题,但是有些业务我们这样处理并不适合。要弄懂这些,我们就需要知道interrupt的作用是什么。
全栈程序员站长
2021/08/05
4990
Java并发编程的中断机制
你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it well enough 现陆续将Demo代码和技术文章整理在一起 Github实践精选 ,方便大家阅读查看,本文同样收录在此,觉得不错,还请Star🌟 横看成岭侧成峰,远近高低各不同,并发编程理论系列基本已经结束,相信大家有了理论的铺垫,近看源码才能发现其设计之美,不会一头雾水 本来是要介绍 AQS 作为我们走进并发编程源码环节的第
二哥聊运营工具
2021/12/17
5650
Java并发编程的中断机制
单片机I/O控制方式(UART中断和DMA中断的区别)
程序循环检测方式的基本思路是:在程序(一般是设备驱动程序)当中,通过不断地检测I/O设备的当前状态,来控制一个I/O操作的完成。具体来说,在进行I/O操作之前,要循环地去检测该设备是否已经就绪。如果是,就向控制器发出一条命令,启动这一次的I/O操作。然后,在这个操作的进行过程中,也要循环地去检测设备的当前状态,看它是否已经完成。总之,在I/O操作的整个过程中,控制I/O设备的所有工作都是由CPU来完成的。这种方式也称为是繁忙等待方式或轮询方式。它的缺点主要是:在进行一个I/O操作的时候,要一直占用着CPU,这样就会浪费CPU的时间。
不脱发的程序猿
2021/01/20
1K0
以 React 的方式思考
React 很棒的一点是创建应用中引导你思考的过程。这篇文档中,我们将通过运用React创建一个产品搜索列表,来引导你熟悉这个思考过程。
fanzhh
2019/08/20
3.5K0
以 React 的方式思考
Spark2.x学习笔记:5、Spark On YARN模式
程裕强
2018/01/02
3.7K1
Spark2.x学习笔记:5、Spark On YARN模式
现在,以编程方式在 Electron 中上传文件,是非常简单的!
本文主要探讨了在 Electron 应用中如何实现上传文件到服务器的功能,同时通过本地代理服务器来获取完整的cookie。首先介绍了在 Electron 应用中如何通过 XHR 上传文件到服务器,然后介绍了如何通过 LocalStorage 将文件保存在本地。最后,本文介绍了一种使用 Electron 创建本地代理服务器,从而获取完整的cookie的方法。
ios122
2017/12/27
5.2K0
现在,以编程方式在 Electron 中上传文件,是非常简单的!
使用 Java REPLJava REPL
https://github.com/albertlatacz/java-repl/releases
一个会写诗的程序员
2018/08/17
5030
使用 Java REPLJava REPL
Java并发编程的艺术(五)——中断
什么是中断? 在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。因此,Java提供了一种用于停止线程的机制——中断。 中断只是一种协作机制,Java没有给中断增加任何语法,中断的过程完全需要程序员自己实现。若要中断一个线程,你需要手动调用该线程的interrupted方法,该方法也仅仅是将线程对象的中断标识设成true;接着你需要自己写代码不断地检测当前线程的标识位;如果为true,表示别的线程要求这条线程中断,此时究竟该做什么需要你自己写代码实现。 每个线程对象中都有
大闲人柴毛毛
2018/03/09
1.2K0
以交互方式安装ESXi 6.0
ESXi 是VMware vSphere一整套解决方案的底层服务器系统,根据不同的应用场景可将ESXi安装在U盘、本地磁盘或ISCSI存储。本文章将介绍如果通过交互方式在本地磁盘安装ESXi 6.0。
全栈程序员站长
2022/07/05
7740
以交互方式安装ESXi 6.0
Docker以挂载方式安装RocketMQ
如果你还没有安装 Docker,请先安装。可以参考官方文档 https://docs.docker.com/install/ 进行安装
关忆北.
2023/10/11
1.6K0
Docker以挂载方式安装RocketMQ
提示以只读方式打开文件
如果不希望内容审阅者意外修改你的文档,可在发送文档供审阅前将其设为只读。 另一种方法是限制格式和编辑。
MIKE笔记
2023/03/22
1.9K0
提示以只读方式打开文件
以 GitOps 方式管理 Terraform 资源
这是我们希望揭示Flux 生态系统[1]项目的博文系列中的第一篇。这次是Terraform 控制器[2]。
CNCF
2022/11/28
2.4K0
以 GitOps 方式管理 Terraform 资源

相似问题

以编程方式启动Scala REPL?

10

使用Ruby REPL以编程方式加载库

10

以编程方式发送键盘中断

36

以编程方式中断raw_input

10

以编程方式中断权限级别继承

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文