正则表达式lookahead
由于之前更改了⾃动删除索引脚本,让保留半个⽉的数据,有⼀些⽆⽤的索引都没有⾃动删除,现在需要⼿动删⼀下,尤其是那些数据为0的索引。
在服务器查看了⼀下,有4个⽇期的索引是空的,乘以数据类别7就是28个,但是由于所有索引有将近200个,如果通过⾁眼去挑出这28个再复制粘贴,⼯作量很⼤、很⽆聊⽽且很容易出错,由于索引都是⽇期格式yyyy_mm_dd结尾,就想着⽤正则匹配的⽅法把它们出来,再在sublime编辑⼀下去服务器执⾏。
1. 正则表达式 $结尾符
我们都知道结尾符号在正则表达式是$,如果有多个情况,则⽤|相连,如要匹配以13或17结尾的⾏,⽤
\w+13$|\w+17$
2. lookahead
那匹配不以xx结尾的呢??正则表达式似乎很难做到,但不是做不到,先要了解Lookahead的概念,可以戳此链接看官⽅⽂档。Lookahead 有分negative和positive两种。
1. Negative lookahead:
如果是要出包含某些字符,但是这些字符后⾯紧跟的不能是某些字符的字符串。格式是⽤括号括起来,?!开头。如q(?!u),可以匹配所有q后⾯不是u的字符,如qa, qb, qc, Iraq等等。对于Iraq,引擎会先匹配到q, 然后发现进⼊了⼀个negtative lookahead, 接下来匹配u字符,但是Iraq后⾯是个空格,所以不满⾜lookahead,再加上是个negative的,负负得正所以会返回q.
2. Positive lookahead:
某些字符后紧跟某些字符的字符串,格式是⽤括号括起来,?=开头。如表达式q(?=u),可以匹配qu,等同于表达式qu。
要挑出不以xx结尾的⾏,很明显要⽤Negative lookahead。
3. 不以xx开头、结尾,不包含xx的正则表达式
了解了概念之后,就可以动⼿写表达式了。
1. 不以17, 18开头的⾏
^(?!17|18).*$
2. 不包含17, 18的⾏,如下可匹配到1,2,5⾏。
^((?!17|18).)*$
3. 不以17, 18结尾的⾏,如下可匹配到1,2,5, 8, 9⾏。
^((?!17$|18$).)*$
4. 解释
接下来以上述3的正则表达式 ^((?!17|18).)*$ 为例,做出解释:
1. ^表⽰从⾏⾸开始匹配
2. 第⼀个左括号(表⽰分组开始
3. 第⼆个左括号(表⽰lookahead开始
4. ?!表⽰是个negative lookahead
5. 17表⽰以17结尾,17|18$表⽰以17或18结尾
6. )表⽰negative lookahead结束
7. .表⽰匹配⾮\n的任意字符,由于每个字符后⾯其实是有个空格的,这个.⼀定不能少
8. )表⽰分组结束
9. *表⽰把最后⼀个匹配到的值放⼊\1变量
10. 在$⾏尾结束匹配
参考:
正则匹配数字结尾字符串附今天整个操作步骤:
1. curl 'localhost:9200/_cat/indices?v'| sort -k 2,先把所有索引拷贝到sublime
2. ⽤sublime的csv⼯具把第⼆列索引列拷贝出来
3. ⽤正则表达式^((?!(04_13|0414|04_17|0418)).)*$,把不是这⼏个⽇期的⾏全部替换成空
4. 把空⾏替换成空
5. ⽤csv⼯具在每列列头插⼊ curl -XDELETE es:9200/
Processing math: 100%
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论