以前只会//.exec("n"),匹配到,这种简单的固定写法,但实际使用次数几乎趋近于0。
很多场景不能写死abc,顺理成章的就写成了/<.+(?!def).+>/.exec("n"),咦?咋把前面的匹配到了!从入门到放弃。
昨天(2019-04-07)随手写了一下/<(?:.(?!def))+>/.exec("n"),原来是对.+(?!排除的字符串)这个结构能起到的作用理解错了,怪不得达不到预期,(.(?!排除的字符串))+才是正解。
留下一个未解的问题,每个字符后面排除一下的能良好工作,一堆未定长度字符后排除一下怎么就不能工作,前瞻不会和前面的+、*、{}起作用吗?解释看结尾。
附:/<(?!.+def).+>/.exec("n")写法也可以。可能是结尾的.+导致的不能匹配,但这样写还是不行:/<.+(?!def)zzz>/.exec("n")。
正则表达式匹配指定内容后面要或不要包含指定的字符串内容:
•要:比较简单,写上这个要的即可
•不要:比要复杂很多,如何排除掉?
前提原则
1.表达式内固定内容的字符串能不写尽量不写,能简写的尽量简化来写(如前面写的abc部分不能写死)
2.可以少量使用前瞻(正向),后瞻(反向)基本不学,学了还要研究那些浏览器支持,不敢用,太多了也学不动。
3.NoJS(Not only Javascript);不仅仅是浏览器中的js;不过js的正则/exp/字面量写法简洁到没盆友(哪个语言),函数、对象、字符串统统不需要;不接受反驳。
假设待匹配的文本
htmlRaw=`
class=" matchX 1"
class=" matchX 2"
class=" matchX 3"
class=" matchX 4"
class=" matchX 5"
class=" matchX 6"
......
`;
//注: *** 不是固定内容,但不会出现未转义的xml实体、matchX、excludeX
//注: class=" matchX 123456"纯文本只做演示干扰之用,不应当作为特征
//如果数据对换行不敏感,应优先转换成没有换行的,大概率可以简化正则逻辑
htmlNoWrap=htmlRaw.replace(/[rn]+/g," ");
//正则测试代码
(/[sS]*/.exec(htmlRaw)||[])[0]
不要单个字符的匹配
匹配出div.matchX标签:
可以直接使用 [^>]把matchX限定在<> HTML标记内,意思就是<>中的文本不要出现结尾的>字符。
单个字符还算简单:
//有效 /]+matchX[^>]+>/.exec(htmlRaw)[0]
如果不限定在<>标记内,可能会匹配出界;并且这种不限定,迟早会出乱子:
//无效 //.exec(htmlNoWrap)[0] //.exec(htmlRaw)[0] //有换行符就是又长又难看
其他单个字符场景另行灵活运用。
不要一个字符串的匹配
匹配出第一层不带excludeX文本内容的第一块div,就是返回包含matchX 4的那块div
[^]语法只能排除掉单个字符,不要一个字符串咋办?硬是要写成[^abc],会把a、b、c字符全部排除掉;除了使用前瞻,好像还没有别的简单办法。
使用本文开头的(.(?!排除的字符串))+结构就能达到目的,核心就在(?:[^>](?!excludeX))*:
//有效 /]*>[^<]+](?!excludeX))*>[^<]+



