详解正则表达式后面不要包含指定的字符串内容

详解正则表达式后面不要包含指定的字符串内容

本文主要介绍了关于正则表达式后不包含指定字符串内容的知识,很好,有一定的参考价值。有需要的朋友可以参考一下。

仅/abc abcbefore(?Def)。/.exec( abcdef nabczz ),匹配到abcczzz,简单的固定写法,但实际使用次数几乎接近0。

很多场景写不死abc,就写成/。(?Def)。/.exec( abcdef nabczz ),嗯?为什么要配上一个!从入门到放弃。

昨天(2019-04-07)随便写的/(?(?Def)) /。exec( abcdef nabczz ),事实证明是对的。(?排除字符串)这个结构所能发挥的作用被误解了。难怪达不到预期,(。(?排除字符串))是正确的解决方案。

留下一个未回答的问题。每个角色演好之后可以排除什么?排除一堆长度未定的字符后怎么就不行了?预见性不会和前面的,*,{}?看结尾。

附:/(?def)。/.exec(abcdefzzznabczzz )也可以写。可能就到头了。结果匹配不上,还是这样不行:/。(?def)zzz/。exec(abcdefzzznabczzz ).

正则表达式匹配是否在指定内容后包含指定的字符串内容:

是的:比较简单。就写这个重要的吧。

不:比实际情况复杂得多。怎么排除?

前提原则

1.表达式中内容固定的字符串,能不写就尽量不写,能写就尽量写简单(比如前面写的abc部分不能写死)

2.不需要学习就可以使用少量的前进(forward)和后退(backward)。如果你学习,你必须学习那些浏览器支持。你不敢用,用多了也学不会。

3.NoJS(不仅仅是JavaScript);不仅仅是浏览器里的JS;但是js的regular /exp/literal写的太简洁了,没有朋友(哪种语言),函数、对象、字符串都没必要;不接受反驳。

假设要匹配的文本

html raw=` 0

div ***=***

*** class=*** ***=***

class= matchX 1

div ***=***

* * * class= * * * matchX * * * * * *= * * * excludeX * * *

class= matchX 2

/div

class= matchX 3

/div

div ***=***

*** class=*** ***=***

class= matchX 4

div ***=***

*** class=*** *** ***=***

class= matchX 5

/div

class= matchX 6

/div

.

`;

//注意:* * * *不是固定内容,但是不会有转义的xml实体,matchX,excludeX。

//注意:class= matchX 123456 纯文本仅用于演示干扰,不应作为功能使用。

//如果数据对换行符不敏感,应该先转换成没有换行符的数据。大概率可以简化正则逻辑。

htmlNoWrap=html raw . replace(/[ r n]/g, );

//常规测试代码

(/[sS]*/。exec(htmlRaw)||[])[0]

不要单个字符的匹配

匹配div.matchX标记:div * * *= * * * class= * * * matchx * * * * * *= * * *

您可以直接使用[]将matchX限制为HTML标记,这意味着中的文本不能以结尾字符出现。

单个字符相当简单:

//有效

/div[^] matchX[^] /。exec(htmlRaw)[0]

如果不局限于标记,可能会匹配出界;而这种无限制,迟早会出错:

//无效

/div。matchX。/.exec(htmlNoWrap)[0]

/div[sS]?matchX[sS]?/.exec(htmlRaw)[0] //又长又丑,带换行符。

其他单角色场景应灵活运用。

不要一个字符串的匹配

匹配第一层没有excludeX文本内容的第一个div是返回包含matchX 4的div。

[]语法只能排除单个字符。如果你不想要一个字符串呢?如果写成【ABC】,则排除所有字符A、B、C;除了用预见,似乎没有其他简单的办法。

使用(。(?Excluded string))结构能达到目的,核心是在(?[^](?excludeX))*:

//有效

/div[^]*[^] div(?[^](?excludeX))*[^] /div[^] /div/。exec(htmlRaw)[0]

要包含字符串匹配,只需直接编写所需的字符串。比较简单,就不写这个例子了。

没研究过(。(?排除的字符串))结构。

对于.+(?!排除)不能工作的释疑

由于(?Exclude)不适用于贪婪匹配的每一个字符串,只适用于贪婪匹配的最后一个字符;意味着lookahead不能阻止最后一个字符之前所有字符的贪婪匹配。

/.(?def)。/.exec(abcdefnabczzz )

第一个。匹配abcde,后面是F,不是def,第二个。匹配F,这是常规的。

额外记录

/(d)(?.1)/.exec(123.141 )的外观如下:

13: d贪婪匹配直到.

12: 123.1被发现不合规(?.1),后退一位。

没有表达式,返回12。

/(.)(?.1)/.exec(123.141 )的外观如下:

13.141:贪婪匹配到底

23.141:符合(?.1)

没有留下表达式,返回123.141。

/(.(?.1)) /.exec(123.141 )的外观如下:

1:匹配新的位。

1: 123符合(?.1)

12:匹配新数字

12: 123.符合(?.1)

13:匹配一个新的

12: 123.1被发现不合规(?.1),后退一个位置,并退出循环。

没有表达式,返回12。

如果要展望每个角色,只有最后写的比较好理解。

总结

以上是边肖给大家介绍的正则表达式。不要在后面包含指定的字符串内容。希望对你有帮助。如果您有任何问题,请给我留言,边肖将及时回复您。非常感谢您对我们网站的支持!

详解正则表达式后面不要包含指定的字符串内容