此信息是一类单向边界技巧。
使用否定向后/向前看断言,
在特定方向内,它会让字符串的BEGIN/END匹配,
但不允许其他人匹配。
这导致了一些有趣的组合场景
一个类中的否定结构,涵盖了无限的范围
字符,但允许您排除其中的一些单独字符
那个范围。
使用的典型构造是否定类。
\D - 非数字类
\S - 非空白类
\W - 非单词类
\PP - 非标点属性类
@987654325 @ - 非字母属性类
因为它们被用在否定断言中,反之实际上是
正在寻找的人物。
\d, \s, \w, \pP, \pL分别
力量来自于它们可以在内部组合的事实
class 用于戏剧效果。
如果单个字符被添加到一个类中,它们会被排除在外,不允许使用。
实际上,它创建了类减法。
创建类时的规则是:
-
类你想要的字符,插入它是负数(即
\D、\PP等)
-
个别字符你不想要,照常插入(即
\n、=等)
这可以用作类减法。
减法示例:(?![\S\r\n]) 将是一个前瞻边界,它需要
只有水平空白,在某些引擎中,表示为
\h 构造。
在您的示例中,边界将是这样的。
(?<![\S\PP-])#big(?![\S\PP-])
打破它
(?<! # Boundary - Behind direction
[\S\PP-] # Need all whitespace and punctuation, but not the '-'
)
\#big
(?! # Boundary - Ahead direction
[\S\PP-] # Need all whitespace and punctuation, but not the '-'
)
添加到类中的每个文字字符实际上都排除了
它来自匹配。
这称为类减法。
测试用例
输入#big and #small, #big, #big, #big-red, #big-red-car and #big
输出
** Grp 0 - ( pos 0 , len 4 )
#big
** Grp 0 - ( pos 17 , len 4 )
#big
** Grp 0 - ( pos 23 , len 4 )
#big
** Grp 0 - ( pos 56 , len 4 )
#big
基本上,只匹配#big 和#small、#big、#big、#big-red、#big-red-car 和#big