混合精度周记(2022.4.25-5.1)

General assignment:

First,you have a C++ program ,and now we want to change the types of specified elements from double to float.Our program does't has class and struct(Because is so complex that we can't handle with it.)

Some ideas

(defination)1.Proverbially,all variables need to be defined before they can be used.So we should find the definations,and change their types to float.

2.we should match the fuction and the variables from a program,so maybe <regex>(a C++ header file)  can help us.

task: to study the basic usage of <regex>

words

proverbially adv. 人尽皆知地

目录

1.1历史

1.2基本概念

1.3 元字符

2.1 英文句号

2.2 字符集

2.3 重复

2.4 花括号

2.5 字符组

2.6 分支结构

2.7 转义特殊字符

2.8 定位符

3. 简写字符集

4. 断言

5. 标记

5.1 不区分大小写

5.2 全局搜索

5.3 多行匹配

6.常用的正则表达式

7.1(非)贪婪模式

1.1历史

regex的概念在上世纪50年代由数学家提出,Ken Thompson首次将其应用于实际。是一种通用概念,整合进多种语言用来处理字符串数据。高级程序语言的正则表达式几乎都从perl语言发展而来,因此,语法几乎一致。

1.2基本概念

正则表达式,又称正规表示法、常规表示法、规则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE),它是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串,几乎在各种计算机编程语言中都有用到。

可以分为普通正则表达式、扩展正则表达式、高级正则表达式。普通正则表达式在linux shell中常用到,高级正则表达式语法规范,基本由perl演化而来。目前常见程序语言(php,perl,python,java,c#)都支持高级正则表达式。

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑

正则表达式 -> 元字符(特殊字符)+文字(普通字符)

在实际语言中,特殊字符是语法,普通字符就是单词。

1.3 元字符

元字符是正则表达式的基本组成元素。元字符在这里跟它通常表达的意思不一样,而是以某种特殊的含义去解释。有些元字符在写在方括号内时有特殊含义。

元字符如下:

元字符

描述

^

匹配行的开始

$

匹配行的结束

[^ ]

否定字符类。匹配方括号中不包含的任意字符

*

匹配前面的子表达式零次或多次

+

匹配前面的子表达式一次或多次

?

匹配前面的子表达式零次或一次,或指明一个非贪婪限定符

{n,m}

花括号,匹配前面字符至少 n 次,但是不超过 m 次。

(xyz)

字符组,按照确切的顺序匹配字符 xyz。

|

分支结构,匹配符号之前的字符或后面的字符。

\

转义符,它可以还原元字符原来的含义,允许你匹配保留字符 [ ] ( ) { } . * + ? ^ $ \ |

.

匹配除换行符以外的任意字符。

[ ]

字符类,匹配方括号中包含的任意字符

^

匹配行的开始

$

匹配行的结束

                                              2.元字符详解

2.1 英文句号

英文句号  “.”  是元字符的最简单的例子。元字符 . 可以匹配任意单个字符。它不会匹配换行符和新行的字符。

".ar" => The car parked in the garage 2ar \ar.

2.2 字符集

字符集也称为字符类。方括号被用于指定字符集。使用字符集内的连字符来指定字符范围。方括号内的字符范围的顺序并不重要。

例如 [Tt]he 表示:大写 T 或小写 t ,后跟字母 h,再后跟字母 e。

"[Tt]he" => The car parked in the garage.

然而,字符集中的英文句号表示它字面的含义。

"ar[.]" => A garage is a good place to park a car.

2.2.1 否定字符集

一般来说插入字符 ^ 表示一个字符串的开始,但是当它在方括号内出现时,它会取消字符集。。

"[^c]ar" => The car parked in the garage.

2.3 重复

以下元字符 +,* 或 ? 用于指定子模式可以出现多少次。这些元字符在不同情况下的作用不同。

2.3.1 星号

星号 * 表示匹配上一个匹配规则零次或多次。正则表达式 a* 表示小写字母 a 可以重复零次或者多次。但是它如果出现在字符集或者字符类之后,它表示整个字符集的重复。

例如正则表达式 [a-z]*,表示:一行中可以包含任意数量的小写字母。

"[a-z]*" => Tdfdsfdfddsfegrgerfwe #21.

星号 * 可以与元符号 . 用在一起,用来匹配任意字符串 .*。星号 * 可以与空格符 \s 一起使用,用来匹配一串空格字符。

"\s*cat\s*" => The fat cat sat on the cat.

2.3.2 加号

加号 + 表示匹配上一个字符一次或多次。

"c.+t" => The fat cat sat on the mat.
 

2.3.3 问号

在正则表达式中,元字符 ? 用来表示前一个字符是可选的。该符号匹配前一个字符零次或一次。

"[T]he" =>The car is parked in the garage.

"[T]?he" =>The car is parked in the garage.

2.4 花括号

在正则表达式中花括号(也被称为量词?)用于指定字符或一组字符可以重复的次数。

"[0-9]{2,3}" => The number was 9.9997 but we rounded it off to 10.0.

我们可以省略第二个数字表示匹配 2 个或更多个数字。如果我们也删除逗号,表示匹配正好为 2 位数的数字。

"[0-9]{2,}" => The number was 9.9997 but we rounded it off to 10.0.

"[0-9]{2}" => The number was 9.9997 but we rounded it off to 10.0.//这里9997分开来匹配

请注意在逗号和两个数之间不能有空格

2.5 字符组

字符组是一组写在圆括号内的子模式 (...)。正如我们在正则表达式中讨论的那样,如果我们把一个量词放在一个字符之后,它会重复前一个字符。

但是,如果我们把量词放在一个字符组之后,它会重复整个字符组。

例如正则表达式 (ab)* 表示匹配零个或多个的字符串“ab”。我们还可以在字符组中使用元字符 |。

"(c|g|p)ar" => The car is parked in the garage.

2.6 分支结构

在正则表达式中垂直条 | 用来定义分支结构,分支结构就像多个表达式之间的条件。现在你可能认为这个字符集和分支结构的工作方式一样。

但是字符集和分支结构巨大的区别是字符集只在字符级别上有作用,然而分支结构在表达式级别上依然可以使用。

"(T|t)he|car" =>The car is parked in the garage.

2.7 转义特殊字符

正则表达式中使用反斜杠 \ 来转义下一个字符。这将允许你使用保留字符来作为匹配字符 { } [ ] / \ + * . $ ^ | ?。在特殊字符前面加 \,就可以使用它来做匹配字符。

例如正则表达式 . 是用来匹配除了换行符以外的任意字符。现在要在输入字符串中匹配 . 字符

"(f|c|m)at\.?" => The fat cat sat on the mat.

 

2.8 定位符

在正则表达式中,为了检查匹配符号是否是起始符号或结尾符号,我们使用定位符。

定位符有两种类型:第一种类型是 ^ 检查匹配字符是否是起始字符,第二种类型是 $,它检查匹配字符是否是输入字符串的最后一个字符。

如果你不使用两个特殊字符,你就在表示要查找的串在被查找串的任意部分——你并不把它定位在某一个顶端

/^ 和 $/成对使用应该是表示要求整个字符串完全匹配定义的规则,而不是只匹配字符串中的一个子串。

2.8.1 插入符号

插入符号 ^ 符号用于检查匹配字符是否是输入字符串的第一个字符。如果我们使用正则表达式 ^a(如果 a 是起始符号)匹配字符串 abc,它会匹配到 a。

但是如果我们使用正则表达式 ^b,它是匹配不到任何东西的,因为在字符串 abc 中“b”不是起始字符。

让我们来看看另一个正则表达式 ^(T|t)he,这表示:大写字母 T 或小写字母 t 是输入字符串的起始符号,后面跟着小写字母 h,后跟小写字母 e。

"(T|t)he" => The car is parked in the garage.

"^(T|t)he" =>The car is parked in the garage.

2.8.2 美元符号

美元 $ 符号用于检查匹配字符是否是输入字符串的最后一个字符。例如正则表达式 (at\.)$,表示:小写字母 a,后跟小写字母 t,后跟一个 . 字符,且这个匹配器必须是字符串的结尾。

"(at\.)" => The fat cat. sat.on the mat.

"(at\.)$" => The fat cat sat on the mat.

 

3. 简写字符集

正则表达式为常用的字符集和常用的正则表达式提供了简写。简写字符集如下:

简写

描述

.

匹配除换行符以外的任意字符

\w

匹配所有字母和数字和下划线的字符:[a-zA-Z0-9_]

\W

匹配非字母和数字和下划线的字符:[^\w]

\d

匹配数字:[0-9]

\D

匹配非数字:[^\d]

\s

匹配空格符:[\t\n\f\r\v]

\S

匹配非空格符:[^\s]

\b

匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b' 可以匹配"never" 中的 ‘er',但不能匹配 "verb" 中的 ‘er'

\B

匹配非单词边界。'er\B' 能匹配 "verb" 中的 ‘er',但不能匹配 "never" 中的 ‘er'

\xn

匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如, ‘\x41′ 匹配 "A"。'\x041′ 则等价于 ‘\x04′ & "1"。正则表达式中可以使用 ASCII 编码。

\cx

匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。 x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 ‘c' 字符。

\f

匹配一个换页符。等价于 \x0c 和 \cL

\n

匹配一个换行符。等价于 \x0a 和 \cJ

\r

匹配一个回车符。等价于 \x0d 和 \cM

\t

匹配一个制表符。等价于 \x09 和 \cI

\v

匹配一个垂直制表符。等价于 \x0b 和 \cK

\num

匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1′ 匹配两个连续的相同字符。

\n

标识一个八进制转义值或一个后向引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为后向引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值

\nm

标识一个八进制转义值或一个后向引用。如果 \nm 之前至少有is preceded by at least nm 个获取得子表达式,则 nm 为后向引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的后向引用。如果前面的条件都不满足,若 n 和 m均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm

\nml

如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml

\un

匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符

4. 断言

后行断言和先行断言有时候被称为断言,它们是特殊类型的非捕获组(用于匹配模式,但不包括在匹配列表中)。当我们在一种特定模式之前或者之后有这种模式时,会优先使用断言。

例如我们想获取输入字符串 $4.44 and $10.88 中带有前缀 $ 的所有数字。我们可以使用这个正则表达式 (?<=\$)[0-9\.]*,表示:获取包含 . 字符且前缀为 $ 的所有数字。

以下是正则表达式中使用的断言:

符号

描述

?=

正向先行断言

?!

负向先行断言

?<=

正向后行断言

?<!

负向后行断言

?:

正向后行断言

4.1 正向先行断言

正向先行断言认为第一部分的表达式的后面必须是先行断言表达式。返回的匹配结果仅包含与第一部分表达式匹配的文本。

要在一个括号内定义一个正向先行断言,在括号中问号和等号是这样使用的 (?=...)。先行断言表达式写在括号中的等号后面。

例如正则表达式 (T|t)he(?=\sfat),表示:匹配大写字母 T 或小写字母 t,后面跟字母 h,后跟字母 e。

在括号中,我们定义了正向先行断言,它会引导正则表达式引擎匹配后面跟着 fat 的 The 或 the。

"(T|t)he(?=\sfat)" => The fat cat sat on the mat.

4.2 负向先行断言

当我们需要指定第一部分表达式的后面不跟随某一内容时,使用负向先行断言。负向先行断言的定义跟我们定义的正向先行断言一样,

唯一的区别在于我们使用否定符号 ! 而不是等号 =,例如 (?!...)。

我们来看看下面的正则表达式 (T|t)he(?!\sfat),表示:从输入字符串中获取全部 The 或者 the 且不匹配 fat 前面加上一个空格字符。

"(T|t)he(?!\sfat)" => The fat cat sat on the mat.

4.3 正向后行断言

正向后行断言用于获取跟随在特定模式之后的所有匹配内容。正向后行断言表示为 (?<=...)。例如正则表达式 (?<=(T|t)he\s)(fat|mat),表示:从输入字符串中获取在单词 The 或 the 之后的所有 fat 和 mat 单词。

"(?<=(T|t)he\s)(fat|mat)" => The fat cat sat on the mat.

4.4 负向后行断言

负向后行断言是用于获取不跟随在特定模式之后的所有匹配的内容。负向后行断言表示为 (?<!...)。例如正则表达式 (?<!(T|t)he\s)(cat),表示:在输入字符中获取所有不在 The 或 the 之后的所有单词 cat。

"(?<!(T|t)he\s)(cat)" => The cat sat on cat.

5. 标记

标记也称为修饰符,因为它会修改正则表达式的输出。这些标志可以以任意顺序或组合使用,并且是正则表达式的一部分。

标记

描述

i

不区分大小写:将匹配设置为不区分大小写。

g

全局搜索:搜索整个输入字符串中的所有匹配。

m

多行匹配:会匹配输入字符串每一行。

5.1 不区分大小写

i 修饰符用于执行不区分大小写匹配。例如正则表达式 /The/gi,表示:大写字母 T,后跟小写字母 h,后跟字母 e。

但是在正则匹配结束时 i 标记会告诉正则表达式引擎忽略这种情况。正如你所看到的,我们还使用了 g 标记,因为我们要在整个输入字符串中搜索匹配。

"The" => The fat cat sat on the mat.

"/The/gi" => The fat cat sat on the mat.

5.2 全局搜索

g 修饰符用于执行全局匹配(会查找所有匹配,不会在查找到第一个匹配时就停止)。

因为我们在正则表达式的末尾使用了 g 标记,它会从整个输入字符串中找到每个匹配项。

".(at)" => The fat cat sat on the mat.

"/.(at)/g" => The fat cat sat on the mat.

5.3 多行匹配

m 修饰符被用来执行多行的匹配。正如我们前面讨论过的 (^, $),使用定位符来检查匹配字符是输入字符串开始或者结束。但是我们希望每一行都使用定位符,所以我们就使用 m 修饰符。

例如正则表达式 /at(.)?$/gm,表示:小写字母 a,后跟小写字母 t,匹配除了换行符以外任意字符零次或一次。而且因为 m 标记,现在正则表达式引擎匹配字符串中每一行的末尾。

"/.at(.)?$/" => The fat
                cat sat
                on the mat.

"/.at(.)?$/gm" => The fat
                  cat sat
                  on the mat.

 

6.常用的正则表达式

正整数

^\d+$

负整数

^-\d+$

整数

^-?\d+$

用户名

^[\w\d.]{4,16}$

字母数字字符

^[a-zA-Z0-9]*$

带空格的字母数字字符

^[a-zA-Z0-9 ]*$

密码

^(?=^.{6,}$)((?=.*[A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z]))^.*$

电子邮件

^([a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4})*$

网址

^(((http|https|ftp):\/\/)?([[a-zA-Z0-9]\-\.])+(\.)([[a-zA-Z0-9]]){2,4}([[a-zA-Z0-9]\/+=%&_\.~?\-]*))*$

日期(MM/DD/YYYY)

^(0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])[- /.](19|20)?[0-9]{2}$

校验登录名

只能输入5-20个以字母开头、可带数字、“_”、“.”的字串

^[a-zA-Z]{1}[a-zA-Z0-9._]{4,9}$

校验纯中文字符

^[\u4E00-\u9FA5]+$

IP地址

^([\d]{1,3}[.]{1}){3}[\d]{1,3}$

7.1(非)贪婪模式

?        当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 ‘o+' 将匹配所有 ‘o'。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值