匹配两个给定标记内的所有文本

Posted

技术标签:

【中文标题】匹配两个给定标记内的所有文本【英文标题】:Match all text within two given markers 【发布时间】:2016-05-10 14:07:30 【问题描述】:

假设我有两个自定义 javascript cmets。

开始://<!-,结束://!>

我想替换这些标记之间的所有内容,以及标记。

//<!- directiveDecoratorComment
    (function directiveDecorator() 
        if (typeof(angular) == 'undefined') return;
        var appElement = document.querySelector('[ng-app]');
        var appName = appElement.getAttribute('ng-app');
        if (typeof(appName) == 'undefined') return;
        var app = angular.module(appName);
        angular.forEach(app._invokeQueue, function(value, key) 
            if (value[1] == 'directive') 
                var directiveName = value[2][0];
                app.config(function($provide) 
                  $provide.decorator(directiveName + 'Directive', function($delegate) 
                    var directive = $delegate[0];
                    console.log("Decorating:",directiveName,'on',appName,'template now ==',"/views/" + directive.templateUrl);
                    directive.templateUrl = "/views/" + directive.templateUrl;
                    return $delegate;
                  );
                );
            
        );
    ());

    //!>

所以这基本上会变成空字符串 javascript 文件。

这是我尝试过的。

string.replace(/([//<])(.+\n*?)([//!>])/g, '');

【问题讨论】:

类似this ? 使用this answer,这似乎有效:str.replace(/\/\/&lt;\!-.*\/\/\!&gt;/g, ''); 请阅读 JavaScript 正则表达式中字符类 ([]) 的含义。你可以从这里开始:developer.mozilla.org/en/docs/Web/JavaScript/Reference/…. 【参考方案1】:

你可以使用

/(\/\/<!-)([^\/]*(?:\/(?!\/!>)[^\/]*)*)(\/\/!>)/g

见regex demo

正则表达式基于 unroll-the-loop 技术。

(\/\/&lt;!-) - 匹配并捕获文字 //&lt;!- ([^\/]*(?:\/(?!\/!&gt;)[^\/]*)*) - 匹配并捕获除//!&gt; 之外的任何内容(此处展开循环意味着我们将除/ 之外的任何字符与[^\/]* 匹配,然后匹配零个或多个/ 组,而/!&gt; 和然后是任意数量的任意字符,但 /) (\/\/!&gt;) - 匹配并捕获//!&gt;

请注意,如果您不使用捕获组,您可能会摆脱它们。

【讨论】:

【参考方案2】:

你想要的是这个:

string.replace(/(\/\/\<\!\-)((.*\n)*.*)(\/\/\!\>)/, '')

【讨论】:

这个更快:(\/\/&lt;!-)([^\/]*(?:\/(?!\/!&gt;)[^\/]*)*)(\/\/!&gt;). @WiktorStribiżew Yours 是唯一一个对我实际使用 javascript 替换方法的人。谢谢! 我会发布它:)【参考方案3】:

您可以使用非贪婪匹配来执行此操作而无需前瞻:

/\/\/<!-[\s\S]*?\/\/!>/
 ^^^^^^^                    MATCH OPENING //<!-
        ^^^^^^^             ANYTHING IN BETWEEN
               ^^^^^^^      CLOSING //!>

\s\S 用于匹配换行符。

【讨论】:

以上是关于匹配两个给定标记内的所有文本的主要内容,如果未能解决你的问题,请参考以下文章

Xpath获取两个a标签之间p内的所有文本

工作总结 错误 using 块缺少结束字符“}”。请确保此块内的所有“{”都有匹配的“}”字符,并且任何“}”都不会解释为标记。

更改文本区域 jquery 内的 html 标记之间的文本

在 HTML 标记的文本内容中查找单词/文本并用突出显示标记替换匹配项的可靠方法是啥?

MySQL -- 标记除 1 个匹配行之外的所有行

POI2000病毒