匹配两个给定标记内的所有文本
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(/\/\/<\!-.*\/\/\!>/g, '');
请阅读 JavaScript 正则表达式中字符类 ([]
) 的含义。你可以从这里开始:developer.mozilla.org/en/docs/Web/JavaScript/Reference/….
【参考方案1】:
你可以使用
/(\/\/<!-)([^\/]*(?:\/(?!\/!>)[^\/]*)*)(\/\/!>)/g
见regex demo
正则表达式基于 unroll-the-loop 技术。
(\/\/<!-)
- 匹配并捕获文字 //<!-
([^\/]*(?:\/(?!\/!>)[^\/]*)*)
- 匹配并捕获除//!>
之外的任何内容(此处展开循环意味着我们将除/
之外的任何字符与[^\/]*
匹配,然后匹配零个或多个/
组,而/!>
和然后是任意数量的任意字符,但 /
)
(\/\/!>)
- 匹配并捕获//!>
请注意,如果您不使用捕获组,您可能会摆脱它们。
【讨论】:
【参考方案2】:你想要的是这个:
string.replace(/(\/\/\<\!\-)((.*\n)*.*)(\/\/\!\>)/, '')
【讨论】:
这个更快:(\/\/<!-)([^\/]*(?:\/(?!\/!>)[^\/]*)*)(\/\/!>)
.
@WiktorStribiżew Yours 是唯一一个对我实际使用 javascript 替换方法的人。谢谢!
我会发布它:)【参考方案3】:
您可以使用非贪婪匹配来执行此操作而无需前瞻:
/\/\/<!-[\s\S]*?\/\/!>/
^^^^^^^ MATCH OPENING //<!-
^^^^^^^ ANYTHING IN BETWEEN
^^^^^^^ CLOSING //!>
\s\S
用于匹配换行符。
【讨论】:
以上是关于匹配两个给定标记内的所有文本的主要内容,如果未能解决你的问题,请参考以下文章
工作总结 错误 using 块缺少结束字符“}”。请确保此块内的所有“{”都有匹配的“}”字符,并且任何“}”都不会解释为标记。