本文主要介绍了关于正则表达式后不包含指定字符串内容的知识,很好,有一定的参考价值。有需要的朋友可以参考一下。
仅/abc abcbefore(?Def)。/.exec(' abcdef \ nabczz '),匹配到abcczzz,简单的固定写法,但实际使用次数几乎接近0。
很多场景写不死abc,就写成/。(?Def)。/.exec(' abcdef \ nabczz '),嗯?为什么要配上一个!从入门到放弃。
昨天(2019-04-07)随便写的/(?(?Def)) /。exec(' abcdef \ nabczz '),事实证明是对的。(?排除字符串)这个结构所能发挥的作用被误解了。难怪达不到预期,(。(?排除字符串))是正确的解决方案。
留下一个未回答的问题。每个角色演好之后可以排除什么?排除一堆长度未定的字符后怎么就不行了?预见性不会和前面的,*,{}?看结尾。
附:/(?def)。/.exec('abcdefzzz\nabczzz ')也可以写。可能就到头了。结果匹配不上,还是这样不行:/。(?def)zzz/。exec('abcdefzzz\nabczzz ').
正则表达式匹配是否在指定内容后包含指定的字符串内容:
是的:比较简单。就写这个重要的吧。
不:比实际情况复杂得多。怎么排除?
前提原则
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,' ');
//常规测试代码
(/[\s\S]*/。exec(htmlRaw)||[])[0]
不要单个字符的匹配
匹配div.matchX标记:div * * *=' * * * ' class=' * * * matchx * * * ' * * *=' * * * '
您可以直接使用[]将matchX限制为HTML标记,这意味着中的文本不能以结尾字符出现。
单个字符相当简单:
//有效
/div[^] matchX[^] /。exec(htmlRaw)[0]
如果不局限于标记,可能会匹配出界;而这种无限制,迟早会出错:
//无效
/div。matchX。/.exec(htmlNoWrap)[0]
/div[\s\S]?matchX[\s\S]?/.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('abcdef\nabczzz ')
第一个。匹配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。
如果要展望每个角色,只有最后写的比较好理解。
总结
以上是边肖给大家介绍的正则表达式。不要在后面包含指定的字符串内容。希望对你有帮助。如果您有任何问题,请给我留言,边肖将及时回复您。非常感谢您对我们网站的支持!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。