除了一个词外,如何匹配所有符号?
需要找到除了一个词以外的所有符号。
(.*) -它能找到所有的符号。
[^v] -它可以找到除了字母v以外的所有符号
但是,如何找到除单词以外的所有符号?
解决办法(如下所述):
((?:(?!here any word for block)[\s\S])*?)或
((?:(?!here any word for block).)*?)
((?:(?!video)[\s\S])*?)
我想查找除|end|之外的所有内容,并替换所有除了‘\’\.
我试着:
需要除|end|以外的所有
var str = '|video| |end| |water| |sun| |cloud|';
// May be:
//var str = '|end| |video| |water| |sun| |cloud|';
//var str = '|cloud| |video| |water| |sun| |end|';
str.replace(/\|((?!end|end$).*?)\|/gm, test_fun2);
function test_fun2(match, p1, offset, str_full) {
console.log("--------------");
p1 = "["+p1+"]";
console.log(p1);
console.log("--------------");
return p1;
}
输出控制台日志:
--------------
[video]
--------------
--------------
--------------
--------------
--------------
--------------
--------------例如,需要:
除[video](外的任何符号
输入- '[video](text-1 *******any symbols except: "[video](" ******* [video](text-2 any symbols) [video](text-3 any symbols) [video](text-4 any symbols) [video](text-5 any symbols)'
输出- <div>text-1 *******any symbols except: "[video](" *******</div> <div>text-2 any symbols</div><div>text-3 any symbols</div><div>text-4 any symbols</div><div>text-5 any symbols</div>
发布于 2019-04-05 14:55:00
场景1
使用史上最好的戏法
这个技术的一个关键,我将多次返回的关键是,我们完全忽略了regex引擎返回的整体匹配:那是垃圾桶。相反,我们检查组1匹配,当设置时,包含我们要寻找的内容。
解决方案:
s = s.replace(/\|end\||\|([^|]*)\|/g, function ($0, $1) {
return $1 ? "[" + $1 + "]" : $0;
});详细信息
\|end\| - |end|匹配| -或\|([^|]*)\| - |匹配,除|之外的任何0+字符都捕获到组1中,然后匹配|。如果出现了组1匹配($1 ?)替换,则将将整个匹配的$0返回到结果。
JS测试:
console.log(
"|video| |end| |water| |sun| |cloud|".replace(/\|end\||\|([^|]*)\|/g, function ($0, $1) {
return $1 ? "[" + $1 + "]" : $0;
})
)
场景2
使用
.replace(/\[(?!end])[^\]]*]\(((?:(?!\[video]\()[\s\S])*?)\)/g, '<div>$1</div>')详细信息
\[ -a [ char(?!end]) -在当前位置之后不允许使用end][^\]]* - 0+字符( ]和[除外)] -a ] char\( -a ( char((?:(?!\[video])[\s\S])*?) -第1组捕获任何字符([\s\S])、0或更多的事件,但尽可能少(*?)不启动[video](字符序列\) -a ) char.发布于 2019-04-05 13:24:10
这样的事情最好分几个步骤来完成。此外,如果您要匹配的东西,您应该使用match。
var str = '|video| |end| |water| |sun| |cloud|';
var matches = str.match(/\|.*?\|/g);
// strip pipe characters...
matches = matches.map(m=>m.slice(1,-1));
// filter out unwanted words
matches = matches.filter(m=>!['end'].includes(m));
// this allows you to add more filter words easily
// if you'll only ever need "end", just do (m=>m!='end')
console.log(matches); // ["video","water","sun","cloud"]请注意,这是如何更容易理解正在发生的事情,也更容易维护和改变在未来的需要。
发布于 2019-04-05 14:39:51
你走在正确的轨道上。下面是regex需要做的事情:
var str = '|video| |end| |water| |sun| |cloud|';
console.log(str.replace(/(?!\|end\|)\|(\S*?)\|/gm, test_fun2));
function test_fun2(match, p1, offset, str_full) {
return "["+p1+"]";
}
并解释了什么是错误的-你有你的负面展望后,|字符。这意味着匹配的引擎将执行以下操作:
|video|,因为模式与它一起工作|end,它在负前瞻,并删除它。|之后立即抓取end|字符,因为这传递了负的前瞻性,并且也适用于.*?。| |序列,因为单词开头的|被上一次匹配所消耗。因此,您最终会匹配以下内容
var str = '|video| |end| |water| |sun| |cloud|';
^^^^^^^ ^^^ ^^^ ^^^
|video| ______| | | |
| | ____________________| | |
| | ____________________________| |
| | __________________________________|这一切都是因为|end匹配被取消了。
如果你把火柴打印出来,你可以看到这个。
var str = '|video| |end| |water| |sun| |cloud|';
str.replace(/\|((?!end|end$).*?)\|/gm, test_fun2);
function test_fun2(match, p1, offset, str_full) {
console.log(match, p1, offset);
}
您将看到第二个、第三个和第四个match是| |捕获的项p1是一个空白(显示得不太好,但在那里),它们的偏移量是12、20、26。
|video| |end| |water| |sun| |cloud|
01234567890123456789012345678901234
^ ^ ^
12 _________| | |
20 _________________| |
26 _______________________|我所做的改变是显式地寻找负前瞻的|end|模式,并且只匹配非空白字符,这样就不会再抓取| |了。
还值得注意的是,您可以将过滤逻辑移到替换的回调,而不是regex。这简化了正则表达式,但使替换变得更加复杂。不过,这是一种公平的权衡,因为如果您有更复杂的条件,代码通常更容易维护:
var str = '|video| |end| |water| |sun| |cloud|';
//capturing word characters - an alternative to "non-whitespace"
console.log(str.replace(/\|(\w*)\|/gm, test_fun2));
function test_fun2(match, p1, offset, str_full) {
if (p1 === 'end') {
return match;
} else {
return "[" + p1 + "]"
}
}
https://stackoverflow.com/questions/55536352
复制相似问题