正则表达式可匹配下列哪些字符串(正则表达式可以匹配变量吗)

http://www.itjxue.com  2023-02-19 10:17  来源:未知  点击次数: 

正则表达式 ab?c[0-9]+.e

(a|b)+表示a或b这两个里面,必须至少有1个

[0-9]*表示数字可有可无

c表示精确匹配1个

所以,只有D符合

正则则表达式中可以匹配任意一个字符的表达式有哪些?

很多表达式可以匹配任意字符如

[\S\s]

表示空格或非空格,

那就是任意字符了

还有一个点

.

在单行模式下表示除了回车以外的任意字符,

在多行模式表示任意字符.

还有

[\W\w]

这种跟[\S\s]

一样,

它表示任意可以组成词的字符和不能组成词的字符

一般这些正则关键字,

大写表示和小写相反的意思,

你两个连一起,中括号括起来,就是

X或者非X

其实就是任意字符了.

请问以下正则表达式分别匹配的是什么样的字符串?

string = re.sub(r"[^A-Za-z0-9(),!?\'\`]", " ", string) 除A-Za-z0-9(),!?'`外的字符,去除

string = re.sub(r'(.)\1+', r'\1\1', string) 匹配两个以上连续的字符,只保留两个连续的字符

string = re.sub(r"\'s", " \'s", string) 匹配 '跟一个空格字符,在'前加个空格

string = re.sub(r"\'ve", " \'ve", string) 've 在'前加个空格

string = re.sub(r"n\'t", " n\'t", string) n'跟制表符,在n前加空格

string = re.sub(r"\'re", " \'re", string) 're 在'前加个空格

string = re.sub(r"\'d", " \'d", string) 'd在'前加个空格

string = re.sub(r"\'ll", " \'ll", string) 'll在'前加个空格

string = re.sub(r",", " , ", string) ,前后各加空格

string = re.sub(r"!", " ! ", string) !前后 各加空格

string = re.sub(r"\(", " \( ", string) (前后加空格

string = re.sub(r"\)", " \) ", string) )前后加空格

string = re.sub(r"\?", " \? ", string) ?前后 加空格

string = re.sub(r"\s{2,}", " ", string) 两个以上连续的空白符,删除

正则表达式 (a | b) + [0 - 9]*c 可匹配下列哪些字符串?

其实满意回答是错的,(a|b)表示匹配a或者b,+表示匹配前面的子表达式一次或多次,[0-9]匹配指定范围内的任意数字,*表示匹配前面的子表达式零次或多次。所以ACD都是对的。

正则表达式^.{0,6} $匹配的字符串是什么

正则表达式:^.{0,6}$匹配任意字符的小于等于6个字符的字符串(包括空字符串)

比如字符串:"你好","20ab0c","ABC"等等(注意字符个数超过6个的字符串将不匹配)

正则表达式字符匹配

正则表达式是匹配模式,要么匹配字符,要么匹配位置

本文所用图示化工具: Regulex

横向模糊指的是,一个正则可匹配的字符串的长度不是固定的,可以是多种情况的

其实现的方式是使用量词。譬如 {m,n} ,表示连续出现最少 m 次,最多 n 次

纵向模糊指的是,一个正则匹配的字符串,具体到某一位字符时,它可以不是某个确定的字符,可以有多种

可能

其实现的方式是使用字符组。譬如 [abc] ,表示该字符是可以字符 a 、 b 、 c 中的任何一个

需要强调的是,虽叫字符组(字符类),但只是其中一个字符

例如 [ abc] ,表示匹配一个字符,它可以是 a 、 b 、 c 之一

如果字符组里的字符特别多的话,怎么办?可以使用范围表示法。

比如 [123456abcdefGHIJKLM] ,可以写成 [ 1-6a-fG-M] 。用连字符 - 来省略和简写

因为连字符有特殊用途,那么要匹配 a 、 - 、 z 这三者中任意一个字符,该怎么做呢?

不能写成 [a-z] ,因为其表示小写字符中的任何一个字符

可以写成如下的方式: [-az] 或 [az-] 或 [a\-z]

即要么放在开头,要么放在结尾,要么转义。总之不会让引擎认为是范围表示法就行了

纵向模糊匹配,还有一种情形就是,某位字符可以是任何东西,但就不能是 a 、 b 、 c

此时就是排除字符组(反义字符组)的概念。例如 [^abc] ,表示是一个除 a 、 b 、 c 之外的任意一个字符。字符组的第一位放 ^ (脱字符),表示求反的概念。

当然,也有相应的范围表示法

如果要匹配任意字符怎么办?可以使用 [\d\D] 、 [\w\W] 、 [\s\S] 和 [^] 中任何的一个

量词也称重复。掌握 {m,n} 的准确含义后,只需要记住一些简写形式

其中正则 /\d{2,5}/ ,表示数字连续出现 2 到 5 次。会匹配 2 位、 3 位、 4 位、 5 位连续数字。

但是其是贪婪的,它会尽可能多的匹配。你能给我 6 个,我就要 5 个。你能给我 3 个,我就要 3 个

反正只要在能力范围内,越多越好

我们知道有时贪婪不是一件好事(请看文章最后一个例子)。而惰性匹配,就是尽可能少的匹配:

其中 /\d{2,5}?/ 表示,虽然 2 到 5 次都行,当 2 个就够的时候,就不再往下尝试了

通过在量词后面加个问号就能实现惰性匹配,因此所有惰性匹配情形如下:

一个模式可以实现横向和纵向模糊匹配。而多选分支可以支持多个子模式任选其一

具体形式如下: (p1|p2|p3) ,其中 p1 、 p2 和 p3 是子模式,用 | (管道符)分隔,表示其中任何之一

例如要匹配字符串 good 和 nice 可以使用 /good|nice/

但有个事实我们应该注意,比如我用 /good|goodbye/ ,去匹配 goodbye 字符串时,结果是 good :

而把正则改成 /goodbye|good/ ,结果是:

也就是说,分支结构也是惰性的,即当前面的匹配上了,后面的就不再尝试了

匹配字符,无非就是字符组、量词和分支结构的组合使用罢了。

下面找几个例子演练一下(其中,每个正则并不是只有唯一写法):

要求匹配:

分析:

表示一个 16 进制字符,可以用字符组 [0-9a-fA-F]

其中字符可以出现 3 或 6 次,需要是用量词和分支结构

使用分支结构时,需要注意顺序

正则如下:

以 24 小时制为例

要求匹配:

分析:

共 4 位数字,第一位数字可以为 [0-2]

当第 1 位为 2 时,第 2 位可以为 [0-3] ,其他情况时,第 2 位为 [0-9]

第 3 位数字为 [0-5] ,第 4 位为 [0-9]

正则如下:

如果也要求匹配 7:9 ,也就是说时分前面的 0 可以省略

此时正则变成:

比如 yyyy-mm-dd 格式为例

要求匹配:

分析:

年,四位数字即可,可用 [0-9]{4}

月,共 12 个月,分两种情况 01 、 02 、…、 09 和 10 、 11 、 12 ,可用 (0[1-9]|1[0-2])

日,最大 31 天,可用 (0[1-9]|[12][0-9]|3[01])

正则如下:

要求匹配:

分析:

整体模式是:

其中匹配 F:\ ,需要使用 [a-zA-Z]:\\ ,其中盘符不区分大小写,注意 \ 字符需要转义

文件名或者文件夹名,不能包含一些特殊字符,此时我们需要排除字符组 [^\\:*|"?\r\n/] 来表示合法

字符

另外它们的名字不能为空名,至少有一个字符,也就是要使用量词 + 。因此匹配 文件夹 \ ,可用

[^\\:*|"?\r\n/]+\\

另外 文件夹```,可以出现任意次。也就是 ([^\\:*|"?\r\n/]+\\)* 。其中括号表示其内部正则是一个整体。具体详细请参考第三章

路径的最后一部分可以是 文件夹,没有 \ ,因此需要添加 ([^\\:*|"?\r\n/]+)?

最后拼接成了一个看起来比较复杂的正则:

其中,在 JavaScript 中字符串要表示字符 \ 时,也需要转义

要求从

提取出 id="container"

可能最开始想到的正则是:

因为 . 是通配符,本身就匹配双引号的,而量词 * 又是贪婪的,当遇到 container 后面双引号时,是不会停下来,会继续匹配,直到遇到最后一个双引号为止

解决之道,可以使用惰性匹配:

当然,这样也会有个问题。效率比较低,因为其匹配原理会涉及到“回溯”这个概念(这里也只是顺便提一

下,后面会详细说明)。可以优化如下:

(责任编辑:IT教学网)

更多

推荐XML/XSLT文章