使用正则表达式删除注释

news2025/1/11 18:34:44

以下摘自某网友来信:
在这里插入图片描述

难点

  • Javascript 不支持点号匹配换行符, 因此无法直接进行多行匹配
  • 处理前面没有 http://, 当然要用否定前瞻( negative lookbehine)了:(?<!http:)\/\/. 可惜 javascript 不支持

在这里插入图片描述

思路

关于多行匹配

这个问题, 之前我已经说过, 要点是使用[\S\s]来模拟匹配换行符的点号。原文在这里:《DIY万能通配符》. 可以以此写出这样的 JS 代码来消除多行注释:

//to uncomment C-style multiple line comment
function uncomment_multi(str)
{
     return str.replace(/\/\*[\S\s]*?\*\//g, "");
}

单行注释之 JS 实现(不完善)

单行注释并没有想像中的那样简单. 如果你认为只要 str.replace("//.*$")即可, 那么必须保证所要处理的文本都是最简单的, 如下:

var pig="ase"; //this is a comment.

事实上这是行不通的.现实程序中下面的例子比比皆是:

var url="http://iregex.org"; //this is my site.
var url="//not real comment here http://iregex.org"; //this is my site.

我尝试使用 JS 写了个模拟否定前瞻的函数, 可以处理http://这种情况, 但是该函数看起来并不令人赏心悦目, 而且也不能处理引号中有双斜杠的情况. 我对 JS 的正则式支持的特性之简陋实在很失望。于是,我求助于 perl 完成这一任务. 先看一下我写的 JS 的删除单行注释的函数:

function uncomment_single(str)
{
    var result;
    var single=new RegExp("\/\/.","ig");
    var start=0;
    while((result=single.exec(str))!=null)
    {
        var part=str.slice(start,result.index);
        var negLeft=new RegExp("http:$","i");
        if (! negLeft.test(part))
        {
            return str.slice(0,result.index);
        }
        start=result.index+result[0].length-1;
    }
    return str;
}

Perl 版删除注释思路及源码(相对完善)

待测试文本

好吧, 既然祭出了强大的 Perl, 之前的小打小闹似的例子就一边去吧. 我将使用如下相对复杂的文本来验证我的程序:

<!DOCTYPE h/tml PUBLIC "-//W3C//DTD XHTML\" 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> sdfasdf//real comment here//"

认真分析单行注释的特点

正确地分析其特点, 是写出合理高效的程序的前提. 观察可知, 单行注释的特点如下:

  • 引号内(包括单引号和双引号)的双斜线不算注释.
  • 引号是配对出现的, 两个引号之间的以反斜线转义掉的引号不算结束符. 例如"hello \" //world", 这里的//world部分不能算做注释.
  • 由连续的非引号非斜线部分组成的字符串也不是注释。特别指出,单个斜线不能算做注释。为什么前半部分不但要非引号而且要非斜线呢?因为[^'"]+是有可能误匹配abcde//real comment "quoted string in comment"这样的情况, 因此我们归纳出一个条件[^'"/]+; 又因为还要避免abcde/real comment "quoted string in comment"这样的情况,还需要特别补充规定单个的斜线不是注释。正则式是[^'"/]|(?<!/)/(?!/)
  • 除去上述内容以外, 以双斜线开始直至行尾的部分就是注释. 因为我们用到了行尾这个概念, 需要在正则式中特别指出是^$匹配行首行尾的多行模式. 使用//m来表示.

正则实现

#!/usr/bin/perl -w
$str = <<"EOF";
<!DOCTYPE h/tml PUBLIC "-//W3C//DTD XHTML\" 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> sdfasdf//real comment here//"
EOF
#print $str;
if ($str=~
    m%
        ^
            (?:
                [^'"/]|
                (?<!/)/(?!/)|
                (?<quote>['"])
                    (?:\\ \g{quote}|
                    (?!\g{quote}).)*
                \g{quote}
            )*
            (?<comment>//.*)
        $
    %xm)
    {
        print $+{comment};
}

几点补充

  • 该程序在 Perl 5.10 版才能运行成功. 因为用到了命名捕获(?<quote>['"])这样比较高阶的特性。当然,不使用 5.10 也并非没有办法, 我们大可以使用 numbered capture,只不过看起来更不直观罢了。
  • 匹配结束后,命名捕获都保存在 hash 表%+中了。使用print $+{comment}这样的方式可以方便地调用
  • 指定了 x 模式, 以便加入空白字符和换行, 让正则表达式看起来有层次感。事实上对于复杂的正则表达式,不使用 x 模式是极其不明智的做法。
  • 为了在字串中方便地表示单双引号, 使用了 heredoc 的方式. 个人觉得不如 python 的三重引号方便。

小结

从正则表达式的角度来说, JS 实在太弱。当然,也与本人的 JS 功底较浅有关系。Perl 对于正则表达式的支持实在是强撼且不遗余力。上面的实现,应该可以涵盖绝大多数的注释情况了。如果您测试出现 bug, 或者遇到更 BT 的字串, 欢迎留言讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/146129.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多线程初阶(四)定时器及线程池

目录 前言&#xff1a; 定时器 使用标准库中定时器 模拟实现定时器 线程池 使用标准库中的线程池 代码实现 ThreadPoolExecutor类介绍 构造方法参数介绍 拒绝策略介绍 模拟实现线程池 代码实现 提出问题 小结&#xff1a; 前言&#xff1a; 这篇文章同上一篇文章…

简单实现Java定时器

✨✨hello&#xff0c;愿意点进来的小伙伴们&#xff0c;你们好呐&#xff01; &#x1f43b;&#x1f43b;系列专栏&#xff1a;【JavaEE】 &#x1f432;&#x1f432;本篇内容&#xff1a;自己实现Java定时器 &#x1f42f;&#x1f42f;作者简介:一名现大二的三非编程小白&…

【手写 Vue2.x 源码】第九篇 - 对象数据变化的观测情况

一&#xff0c;前言 上篇&#xff0c;主要介绍了数组深层观测的实现&#xff0c;核心几个点如下&#xff1a; 最初仅对数组类型进行了原型方法重写&#xff0c;并未进行递归处理&#xff0c;所以&#xff0c;当时仅实现了数组的单层劫持&#xff1b; 通过对数组进行 observe…

二、Gtk4-GtkApplication and GtkApplicationWindow

1 GtkApplication 1.1 GtkApplication and g_application_run 人们编写编程代码来开发应用程序。什么是应用程序?应用程序是使用库运行的软件&#xff0c;其中包括操作系统、框架等。在GTK 4编程中&#xff0c;GTK应用程序是使用GTK库运行的程序(或可执行程序)。 编写GtkAp…

信创改造,你了解多少?

最近&#xff0c;“信创”一词在IT圈瞬间爆火&#xff0c;那什么是信创&#xff1f;又能带来哪些突破性的改变&#xff1f;跟随佑友一起来详细了解一下… 信创的来源 2016年3月4日&#xff0c;24家专业从事软硬件关键技术研究及应用的国内单位&#xff0c;共同发起成立了一个非…

分布式链路追踪-skywalking入门体验

背景 旁友&#xff0c;你的线上服务是不是偶尔来个超时&#xff0c;或者突然抖动一下&#xff0c;造成用户一堆反馈投诉。然后你费了九牛二虎之力&#xff0c;查了一圈圈代码和日志才总算定位到问题原因了。或者公司内部有链路追踪系统&#xff0c;虽然可以很轻松地通过监控判…

deb dpkg fpm cpack debmake 打包

文章目录deb 简介hello debfpmpreinst postinst prerm postrmcmake cpackdebmakedeb 简介 deb: Linux发行版Debian系列(如Debian, Ubuntu等)的软件包格式, 没有自提取(Self-extracting), 不能直接运行, 需要借助dpkg等安装. Dpkg: Debian Package Manager, Debian包管理器, 中…

Python读取各种形式文件(excel,txt),python基本用法

读取excel,读取结果是dataframe形式。 excelFile ranalyze_search_category.xlsx df pd.DataFrame(pd.read_excel(excelFile)) print(df) 详情&#xff1a;(21条消息) 在Python中使用Pandas.DataFrame对Excel操作笔记一 - 从Excel里面获取说需要的信息_fengqiaoxian的博客-CS…

TensorFlow之模型保存与加载

模型在训练过程中或者在训练之后&#xff0c;模型的执行过程能被保存&#xff0c;也就是&#xff0c;模型能从暂停中恢复以免训练的时间过长。因此&#xff0c;被保存的模型可以被共享&#xff0c;其他人可以重新构建相同的模型。被保存的模型以如下的两种方式进行共享&#xf…

青训营——前端方向练习题(不定项选择题例题)

文章目录 &#x1f4c4;前言 PART1 PART2 PART3 PART4 PART5 PART6 PART7 PART8 PART9 &#x1f4c4;前言 一共有十八题&#xff0c;题目选项为不定项&#xff0c;有单选&#xff0c;也有多选。 PART1 选择题 1&#xff1a; 下列哪些是 HTML5 的新特性&#xff1f; A…

Android 深入系统完全讲解(3)

3 Zygote 虚拟机的流程&#xff0c;学习方法 说完了 init 的启动过程&#xff0c;我们来说说 Zygote 的启动过程。 这里我们看下整个的步骤&#xff0c;主要完成了&#xff1a; 1 startVM() 创建虚拟机 2 startReg() 注册 JNI 方法 3 preload()预加载通用类&#xff0c;这里主…

【信管7.1】质量与质量管理过程

质量与质量管理过程对于我们的项目管理理论相关的学习来说&#xff0c;质量是除了范围、进度、成本之外的另一个核心内容。还记得我们在学习敏捷的时候讲过的项目管理三角形吗&#xff1f;通过之前的课程&#xff0c;我们已经学完了它的三个支点。接下来&#xff0c;我们就要学…

播客丨关于年终总结,程序员有话说

绘声绘影绘声绘影是网易云信独家打造的一档聚焦行业热点、个人成长方面的播客栏目。栏目希望通过邀请不同背景、不同行业、不同阅历的企业研发、产品、运营等相关岗位负责人作为节目嘉宾&#xff0c;以自身职业视角交流行业洞见和发展前景&#xff1b;以过来人的视角分享在时代…

dfs、bfs搜索题型小结

一、全排列 &#xff08;1&#xff09;1199&#xff1a;全排列 原题链接 解析 &#xff08;2&#xff09;剪枝思想 满足等式关系的全排列——dfs剪枝 &#xff08;3&#xff09;P1088 [NOIP2004 普及组] 火星人 原题链接 解析 二、组合&#xff08;选与不选&#xff09;…

web(四)—— CSS基础(选择器进阶、Emmet语法、背景属性、元素显示模式、三大特性)

一、选择器进阶目标&#xff1a;能够理解 复合选择器 的规则&#xff0c;并使用 复合选择器 在 HTML 中选择元素1. 复合选择器1.1 后代选择器&#xff1a;空格作用&#xff1a;根据 HTML 标签的嵌套关系&#xff0c;选择父元素 后代中 满足条件的元素 选择器语法&#xff1a;选…

Maven的安装配置与基本使用

Maven简介&#xff1a; Maven是专门用于管理和构建java项目的工具&#xff0c;它的主要功能有&#xff1a; 提供了一套标准化的项目结构标准化的项目结构&#xff1a; Maven提供了一套标准化的项目结构&#xff0c;所有的IDE使用Maven构建的项目结构完全一样&#xff0c;所有…

【IEEE出版社】人工智能、数据挖掘、机器人、传感等领域SCI,自引率低,对国人友好,评职毕业高分好刊~

1区人工智能类SCI&EI 【出版社】IEEE 【自引率】4.30%&#xff08;低&#xff09; 【国人占比】13.40% 【期刊简介】IF:6.5-7.0&#xff0c;JCR1区&#xff0c;中科院3区 【检索情况】SCI&EI 双检&#xff0c;正刊 【参考周期】3-5个月左右录用 【截稿日期】202…

如何彻底关闭Win10自动更新,Win10永久关闭自动更新的方法

如何彻底关闭Win10自动更新&#xff1f;Win10自动更新的问题是很多用户都遇到的问题&#xff0c;很多时候我们关闭了自动更新&#xff0c;过一段时间系统又自动更新了&#xff0c;由于win10自动更新非常顽固&#xff0c;所以我们要从多个地方下手才能永久关闭其自动更新&#x…

Java中几种常量池的区分

文章目录前言了解一下 ldc 指令字符串常量池在 Java 内存区域的哪个位置1.全局字符串池&#xff08;string pool也有叫做string literal pool&#xff09;2.class文件常量池&#xff08;class constant pool&#xff09;3.运行时常量池&#xff08;runtime constant pool&#…

干货 | Python的面试题目+答案合集

作为一个 Python 新手&#xff0c;你必须熟悉基础知识。 在本期内容中我们将讨论一些 Python 面试的基础问题和高级问题以及答案&#xff0c;以帮助你完成面试。 包括 Python 开发问题、编程问题、数据结构问题、和 Python 脚本问题。 接下来让我们来深入研究这些问题 Pytho…