正则表达式的作用
正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex、regexp或RE),是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符"),是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。
如何快速上手?
1、打开 学习、构建和测试正则表达式网址:RegExr: Learn, Build, & Test RegEx
2.我们点开Cheatsheet(备忘单)
可以看到一共分成了五个部分
字符类:
表达式 | 含义 |
---|---|
. | 任何字符(除换行符外) |
\w \d \s | 单词、数字、空格 |
\W \D \S | 非(词、数字、空格) |
[abc] | a、b或c中的任何一个 |
[^abc] | 非 a、b或c |
[a-g] | a到g之间的字符 |
锚点定位:
表达式 | 含义 |
---|---|
^abc$ | 字符串的开头/结尾 |
\b \B | 单词边界字符、单词非边界字符 |
转义字符:
表达式 | 含义 |
---|---|
\. \* \\ | 如果需要匹配它们本身而不是它们的特殊含义,则需要在它们前面加上反斜杠 '\' 进行转义 |
\t \n \r | tab ,换行,回车 |
组和环:
表达式 | 含义 |
---|---|
(abc) | 捕获组 |
\1 | 对组#1的反向引用 |
(?:abc) | 非捕获组 |
(?=abc) | 正向前看 |
(?!abc) | 负向前看 |
词量与交替:
表达式 | 含义 |
---|---|
a*a+a? | 0 个或多个、1 个或多个、0 或 1 个 |
a{5}a{2,} | 恰好五个、两个或更多 |
a{1,3} | 一到三之间 |
a+?a{2,}? | 尽可能少的匹配 |
ab|cd | 匹配 ab 或 cd |
表达式介绍完了,我们举个例子来使用一下这些内容:
Unity的Animator有这么一个接口
public void Play(string stateName, [DefaultValue("-1")] int layer, [DefaultValue("float.NegativeInfinity")] float normalizedTime)
我们希望在代码中调用的地方全部改为自身定义的 PlayAnimation
public class AnimCacheManager
{
public static void PlayAnimation(Animator animator, string animationName, int layer = -1, float normalizedTime = 0,float speed = 1)
{
if (animator == null)
{
return;
}
animator.speed = speed/MatchSpeedMgr.Instance.SpeedValue;
animator.Play(animationName, layer, normalizedTime);
}
}
首先我们需要找到.Play前的字符串,因为变量名可以有数字所以
- 用 \S可以表示配空字符,
- 用组()和 * 表示一个或者多个字符组组成的变量名
(\S*)\.Play
接下来就是匹配括号里的内容了
首先补齐 ();应为(是组符号,所以匹配(自生就需要 \转义 得出 (\S*)\.Play\(\);
Play()括号中有 :,数字,字符,所以我们可以匹配 任何字符(除换行符外)可以使用 .* ,然后用组 ()组合 得出(.*)
加入到上面的正则表达式中就有:
(\S*)\.Play\((.*)\);
筛选出来符合的字符串之后就是替换成我们自己的接口字符串:
AnimCacheManager.PlayAnimation($1,$2);
$1 表示匹配的第一个组 : (\S*)
$2 表示匹配的第二个组 :(.*)
我们拿 JetBrains Rider 来做测试:
可以看出,字符串替换成功。
总结:
1.我这边举的例子算比较复杂的,但是拆解之后可以看出并不难
2.当你不理解含义的时候直接点击参考理解即可:
3.合理的使用正则表达式到工作中可以大大的提高工作效率
4.正则表达式回了就不难
5.不用死背表达式,忘了就来网址上找就行