首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >除一个单词外,所有符号都匹配

除一个单词外,所有符号都匹配
EN

Stack Overflow用户
提问于 2019-04-05 13:20:07
回答 3查看 1.3K关注 0票数 2

除了一个词外,如何匹配所有符号?

需要找到除了一个词以外的所有符号。

(.*) -它能找到所有的符号。

[^v] -它可以找到除了字母v以外的所有符号

但是,如何找到除单词以外的所有符号?

解决办法(如下所述):

代码语言:javascript
复制
((?:(?!here any word for block)[\s\S])*?)

((?:(?!here any word for block).)*?)

((?:(?!video)[\s\S])*?)

我想查找除|end|之外的所有内容,并替换所有除了‘\’\.

我试着:

需要除|end|以外的所有

代码语言:javascript
复制
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;
}

输出控制台日志:

代码语言:javascript
复制
--------------
[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>

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-04-05 14:55:00

场景1

使用史上最好的戏法

这个技术的一个关键,我将多次返回的关键是,我们完全忽略了regex引擎返回的整体匹配:那是垃圾桶。相反,我们检查组1匹配,当设置时,包含我们要寻找的内容。

解决方案:

代码语言:javascript
复制
s = s.replace(/\|end\||\|([^|]*)\|/g, function ($0, $1) { 
    return $1 ? "[" + $1 + "]" : $0; 
});

详细信息

  • \|end\| - |end|匹配
  • | -或
  • \|([^|]*)\| - |匹配,除|之外的任何0+字符都捕获到组1中,然后匹配|

如果出现了组1匹配($1 ?)替换,则将将整个匹配的$0返回到结果。

JS测试:

代码语言:javascript
复制
console.log(
   "|video| |end| |water| |sun| |cloud|".replace(/\|end\||\|([^|]*)\|/g, function ($0, $1) { 
        return $1 ? "[" + $1 + "]" : $0; 
    })
)

场景2

使用

代码语言:javascript
复制
.replace(/\[(?!end])[^\]]*]\(((?:(?!\[video]\()[\s\S])*?)\)/g, '<div>$1</div>')

regex演示

详细信息

  • \[ -a [ char
  • (?!end]) -在当前位置之后不允许使用end]
  • [^\]]* - 0+字符( ][除外)
  • ] -a ] char
  • \( -a ( char
  • ((?:(?!\[video])[\s\S])*?) -第1组捕获任何字符([\s\S])、0或更多的事件,但尽可能少(*?)不启动[video](字符序列
  • \) -a ) char.
票数 4
EN

Stack Overflow用户

发布于 2019-04-05 13:24:10

这样的事情最好分几个步骤来完成。此外,如果您要匹配的东西,您应该使用match

代码语言:javascript
复制
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"]

请注意,这是如何更容易理解正在发生的事情,也更容易维护和改变在未来的需要。

票数 2
EN

Stack Overflow用户

发布于 2019-04-05 14:39:51

你走在正确的轨道上。下面是regex需要做的事情:

代码语言:javascript
复制
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+"]";
}

并解释了什么是错误的-你有你的负面展望后,|字符。这意味着匹配的引擎将执行以下操作:

  1. 匹配|video|,因为模式与它一起工作
  2. 抓取下一个|
  3. 找到下一个文本是end,它在负前瞻,并删除它。
  4. |之后立即抓取end
  5. 获取空格和下一个|字符,因为这传递了负的前瞻性,并且也适用于.*?
  6. 继续抓取中间的| |序列,因为单词开头的|被上一次匹配所消耗。

因此,您最终会匹配以下内容

代码语言:javascript
复制
var str = '|video| |end| |water| |sun| |cloud|';
           ^^^^^^^     ^^^     ^^^   ^^^
|video| ______|         |       |     |
| | ____________________|       |     |
| | ____________________________|     |
| | __________________________________|

这一切都是因为|end匹配被取消了。

如果你把火柴打印出来,你可以看到这个。

代码语言:javascript
复制
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是一个空白(显示得不太好,但在那里),它们的偏移量是122026

代码语言:javascript
复制
|video| |end| |water| |sun| |cloud|
01234567890123456789012345678901234
            ^       ^     ^
12 _________|       |     |
20 _________________|     |
26 _______________________|

我所做的改变是显式地寻找负前瞻的|end|模式,并且只匹配非空白字符,这样就不会再抓取| |了。

还值得注意的是,您可以将过滤逻辑移到替换的回调,而不是regex。这简化了正则表达式,但使替换变得更加复杂。不过,这是一种公平的权衡,因为如果您有更复杂的条件,代码通常更容易维护:

代码语言:javascript
复制
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 + "]"
  }
}

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

https://stackoverflow.com/questions/55536352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档