正则表达式:
(?<=^.{n}).{n,m-n}
表达式解析:
n:提取字符串的起始坐标
m:提取字符串的结束坐标
如要从 abc12345ssdlh 字符串中,提取从第3位开始到第8位的字符串12345。
正则表达式为(?<=^.{3}).{3,5}
整个正则拆为三部分
^.{n}
这部分表示匹配任意开头的n个字符
(?<=^.{n})
这部分的语法使用正则表达式的后行断言
。
正则表达式的先行断言和后行断言一共有 4 种形式:
- (?=pattern) 零宽正向先行断言(zero-width positive lookahead assertion)
- (?!pattern) 零宽负向先行断言(zero-width negative lookahead assertion)
- (?<=pattern) 零宽正向后行断言(zero-width positive lookbehind assertion)
- (?<!pattern) 零宽负向后行断言(zero-width negative lookbehind assertion)
这里面的 pattern 是一个正则表达式。
如同 ^ 代表开头,$ 代表结尾,\b 代表单词边界一样,先行断言和后行断言也有类似的作用,它们只匹配某些位置,在匹配过程中,不占用字符,所以被称为"零宽"。所谓位置,是指字符串中(每行)第一个字符的左边、最后一个字符的右边以及相邻字符的中间(假设文字方向是头左尾右)。
(?<=pattern) 代表字符串中的一个位置,如下图中带颜色的小竖线,紧接该位置之前的字符序列能够匹配 pattern。
例如对 regex represents regular expression 这个字符串,有 4 个单词,要想匹配单词内部的 re,但不匹配单词开头的 re,可以用 (?<=\w)re,单词内部的 re,在 re 前面应该是一个单词字符。
之所以叫后行断言,是因为正则表达式引擎在匹配字符串和表达式时,是从前向后逐个扫描字符串中的字符,并判断是否与表达式符合,当在表达式中遇到该断言时,正则表达式引擎需要往字符串前端检测已扫描过的字符,相对于扫描方向是向后的。
.{n,m-n}
这部分就是匹配任意字符最少匹配 n 次且最多匹配 m 次。
更多推荐
正则表达式: 提取指定范围[n~m]字符内容
发布评论