- 删除URL里的参数
// 移除href里的param
var removeParam = function(param){
var reg = new RegExp('(\\?|&)' + param + '=[^&]*(&)?', 'g');
return location.href.replace(reg, function(p0, p1, p2) {
return p1 === '?' || p2 ? p1 : '';
})
}
- 匹配一个单词
\b
(元字符,metacharacter),代表着单词的开头或结尾,也就是单词的分界处。虽然通常英文的单词是由空格,标点符号或者换行来分隔的,但是\b
并不匹配这些单词分隔字符中的任何一个,它只匹配一个位置。 比如\bhi\b
。
\bhi\b.*\bLucy\b
: 匹配 hi .... Lucy
不能换行,.*
匹配任意数量的不包含换行的字符。
-
\s
匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等。
\w
匹配字母或数字或下划线或汉字等。
\ba\w*\b
匹配以字母a开头的单词——先是某个单词开始处(\b
),然后是字母 a
, 然后是任意数量的字母或数字(\w*
),最后是单词结束处(\b
)
\b\w{6}\b
匹配刚好6个字符的单词。
- 分支条件
目标:(010)88886666,或022-22334455,或02912345678
实现:1. \(?0\d{2}[) -]?\d{8}
:首先是一个转义字符 \(
,它能出现0次或1次(?
),然后是一个0
,后面跟着2个数字(\d{2}
),然后是 )
或 -
或空格中的一个,它出现1次或不出现(?
),最后是8个数字(\d{8}
). 不幸的是,刚才那个表达式也能匹配010)12345678或(022-87654321这样的“不正确”的格式。
要解决这个问题,我们需要用到分支条件。正则表达式里的分枝条件指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,具体方法是用 |
把不同的规则分隔开.
0\d{2}-\d{8}|0\d{3}-\d{7}
这个表达式能匹配两种以连字号分隔的电话号码:一种是三位区号,8位本地号(如010-12345678),一种是4位区号,7位本地号(0376-2233445)。
-
后向引用
使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。\b(\w+)\b\s+\1\b
匹配重复的单词。eg:go go
- 零宽断言
为什么叫零宽,用于查找某些内容(但不包括这些内容)之前或之后的东西,它们像\b
^
$
指定一个位置(零宽),这个位置满足一定的条件(即断言)。
\b\w+(?=ing\b)
匹配以ing结尾的单词的前面部分(除了ing以外的部分)
(?<=\bre)\w+\b
匹配以re开头的单词的后半部分(除了re以外的部分)
(?<=\s)\d+(?=\s)
匹配以空白符间隔的数字(再次强调,不包括这些空白符)
- 负向零宽断言
想要确保某个字符没有出现,但并不想去匹配它
例如,如果我们想查找这样的单词--它里面出现了字母q,但是q后面跟的不是字母u,我们可以尝试这样:
\b\w*q[^u]\w*\b
匹配包含后面不是字母u的字母q的单词 但是如果多做测试(或者你思维足够敏锐,直接就观察出来了),你会发现,如果q出现在单词的结尾的话,像Iraq,Benq,这个表达式就会出错。这是因为[^u]
总要匹配一个字符,所以如果q是单词的最后一个字符的话,后面的 [^u]
将会匹配q后面的单词分隔符(可能是空格,或者是句号或其它的什么),后面的\w*\b
将会匹配下一个单词,于是 \b\w*q[^u]\w*\b
就能匹配整个Iraq fighting。负向零宽断言能解决这样的问题,因为它只匹配一个位置,并不消费任何字符。现在,我们可以这样来解决这个问题:\b\w*q(?!u)\w*\b
(?!exp)
,断言此位置的后面不能匹配表达式exp
。
例如:
\d{3}(?!\d)
匹配三位数字,而且这三位数字的后面不能是数字;
\b((?!abc)\w)+\b
匹配不包含连续字符串abc的单词。
(?<![a-z])\d{7}
匹配前面不是小写字母的七位数字
https://deerchao.cn/tutorials/regex/regex.htm#negativelookaround
网友评论