任意字符: [\s\S]*
匹配空格 ,有3种:
半角空格' ',匹配代码:【\x{0020}】或者【\x20】
全角空格' ',匹配代码:【\x{3000}】
同时匹配全半角:[\x{0020}|\x{3000}]
空格占位符' ',匹配代码:【\x{00a0}】
匹配转义字符,
如果需要用它们的原始意义,则应该对它进行转义,
'\'、'?'、'*'、'^'、'$'、'+'、'('、')'、'|'、'{'、'['
'\\' 匹配字符'\'
\" 双引号,匹配字符"
\' 单引号,匹配字符'
'\.' 匹配字符'.',在正则中表示.的时候都是\.
'\?' 匹配字符'?'
'\*' 匹配字符'*'
'\^' 匹配字符'^'
'\$' 匹配字符'$'
'\+' 匹配字符'+'
'\(' 匹配字符'('
'\)' 匹配字符')'
'\|' 匹配字符'|'
'\{' 匹配字符'{'
'\}' 匹配字符'}'
'\[' 匹配字符'['
'\]' 匹配字符']'
不可见字符 非打印字符
\r 匹配字符回车
\n 匹配字符新行
\a 警报(ANSI C)
\b 退格
\f 换页
\t 水平制表符,tab键
\v 垂直制表符
匹配编码
\nnn 匹配一个8进制ASCII
\xnn 匹配一个16进制ASCII
\unnnn \u{xxxx}、\x{xxxx} 匹配4个16进制的Uniode
匹配ASCII码表范围内字符:[\x00-\x7f]
匹配非ASCII码表范围内字符:[^\x00-\x7f]
匹配中文字符:[\u4e00-\u9fa5]
匹配非中文字符:[^\u4e00-\u9fa5]
匹配空行 空白行 换行符
单行空行(包括空白字符行):^\s*\n
多行空行(包括空白字符行):\s*\n
匹配只有两个字的行: ^..$
string pattern = @"^\s*\n"; //空行,包括空白字符行
string pattern = @"\s*\n"; //换行符
匹配只有两个字的行: ^..$
范围匹配
x 开头 z 结尾的 提取中间范围
例如:
string input ="x123456z"; //x开头z结尾字符串,想要匹配中间的'123456'
string pattern = @"(?<=x)(?:(?!z).)*";
string s2 = Regex.Matches(input, pattern, options)[0].Value;
Console.WriteLine(s2);
//output
s2 == '123456'
分析:
开头 :(?<=x) 如果x开头
(?!z). 不含Z的字符串
中间:(?:(?!z).)* 用非捕获分组 把 不含Z的字符串 看作一个整体 的匹配项
结尾:
方法2:
string input = "x123456z"; //x开头z结尾字符串,想要匹配中间的'123456'
string pattern = @"x([^z]+)";
string s2 = Regex.Matches(input, pattern)[0].Groups[1].Value;
Console.WriteLine(s2);
//output
s2 == '123456'
分析
思路讲解:
1.匹配开头:x
2.匹配中间的内容:要排除右边的z字符,:[^z]+
方法3:
匹配开头:正文<\/dt>
匹配中间:([\s\S]*)
匹配结尾:(?=<\/dl)
正文<\/dt>([\s\S]*)(?=<\/dl)
分组与替换
匹配表达式字符串中:
()括号包起来的表达式表示一个分组,第二个括号包起来的就是第二个分组,以此类推。分组从0开始,默认第0个分组,表示整个字符串.但是要排除两种括号情况:1.零宽断言的括号和2.gmis标志的括号不算分组.
替换表达式字符串中:
$1 和 \1 表示的意思相同(引用匹配到的第一个分组),\5或者$5就表示引用第5个分组。
\0表示整个字符串 Match.Groups[0].Value
匹配英文单词
\b\S*\b
解释:
\b表示 1.字母与空格空白符的边界 2.字母与行首行尾的边界 3.字母与半角标点符号的边界
\S表示非空白字符
匹配了以 'm' 开头以 'e' 结尾的单词
\bm\S*e\b
如匹配:
make
maze
manage
measure
零宽断言 如果 那么 边界定位
表达式 | 意义 | 案例 | |
(?=X) | 如果是X | AB(?=C) | 如果AB字母后面是C的话 |
(?!X) | 如果不是X | (?!56)89 | 如果89前面不是56的话 |
(?<=X) | 如果是X开头 | ||
(?!<X) | 如果不是X结尾 | ||
(?:(X).)* | 如果是不含Z的字符串 | (?:(?!</dl).)* | |
(?is) | gmis标志:允许 . 匹配换行符和不区分大小写搜索 |
1,=号的,是肯定匹配
2,< 号的 ,是写在前面的,取后面的值
3,!号的 ,是否定的,
4,不带<号的,是写在后面的,取前面的值,
如果行的尾部 是以字母结尾,下一行还有字母和标点符号,那么就把行首尾连接起来.作用英文文章的句子以标点符号作为每行结尾
匹配表达式:(([a-zA-Z—])\r\n)(?=^.+[,\.\?!"]+.*\r\n)
替换表达式:$2
gmis标志
g 全局搜索。
i 不区分大小写搜索。
m 多行搜索。
s 允许 . 匹配换行符。
u 使用unicode码的模式进行匹配。
y 执行“粘性(sticky)”搜索,匹配从目标字符串的当前位置开始。
用法: (?xx)(?跟2两个标志) 例子:(?is) 例子2:(?gi) (?yu)
url site 正则网站
:
在线计算正则网站 已失效http://xn--3br16j6xunsoc1ar2lk3am43e/ 在线计算正则网站嗨正则-正则表达式在线测试与调试工具-支持JS,PHP,Python,Golang,PCRE-支持Mac/Win/Android三端安装使用
https://hiregex.com/r/03Ams2/1C#在线代码执行编译器
http://www.dooccn.com/csharp/正则解析Regular expression visualizer using railroad diagrams
https://regexper.com/
正则大全https://github.com/XianZhengquan/any-rule
正则相关的英文
名称英文 | 名称中文 |
Assert | 断言 |
match | 匹配 |
Group | 分组 |
Capturing group | 捕获分组 |
matches | 匹配的组 |
Lookahead | 先行 |
Lookbehind | 回顾,后行 |
Regex | 表达式 |
Positive | 正向 |
Negative | 负向 |
gmis | 正则表达式标志 |
Positive Lookahead | 正向先行 |
Negative Lookahead | 负向先行 |
Positive Lookbehind | 正向回顾 |
Negative Lookahead | 负向回顾 |
Non-capturing group | 非捕获分组 |
匹配xx开头xx结尾
regex = r"\"([^\"]+)\""#双引号之内的内容
匹配中括号开头中括号结尾的之间内容
(\[[^\]]+\])
思路讲解:
1.匹配左边中括号:\[
2.匹配中括号内的内容,要排除右边的中括号符号,因为中括号是结尾符号:[^\]]+
3.匹配右边的中括号:\]
匹配中括号里的内容
(.*)\[([^\[\]]*)\](.*)
如匹配 :
abc[123]abc
匹配' /'开头 'y'结尾的之间内容
(/[^y]+y)
如匹配 :
/// <summary
C# 代码
/*
string str = "a[中国人]b";
var start = "[";
var end = "]";
return "中国人"
*/
/// <summary>
/// 从str中提取start开始到end结尾的内容
/// <param name="str">a[中国人]b</param>
/// <param name="start">[</param>
/// <param name="end">]</param>
/// <returns>中国人</returns>
/// </summary>
public static string PickUpCenter(this string str, string start, string end)
{
start = start.ToNomalStr();
end = end.ToNomalStr();
var pattern = "(?<=" + start + ")([.\\S\\s]*)(?=" + end + ")";
//Console.WriteLine(pattern);
Match result = Regex.Match(str,pattern);
if (result.Success)
{
return result.Value;//此为匹配出的值
}
else
return string.Empty;
}
/// <summary>
/// 从str中提取start开始到end结尾的内容
/// <param name="str">a[中国人]b</param>
/// <param name="start">[</param>
/// <param name="end">]</param>
/// <returns>中国人</returns>
/// </summary>
public static List<string> PickUpCenters(this string str, string start, string end)
{
start = start.ToNomalStr();
end = end.ToNomalStr();
var pattern = "("+start + ")(" + "[^" + end + "]+" + ")(" + end+")";
// var pattern = "(?<=" + start + ")([.\\S\\s]*)(?=" + end + ")";
Console.WriteLine(pattern);
var result = Regex.Matches(str, pattern);
List<string> res =new List<string>();
if (result.Count > 0)
{
foreach (Match VARIABLE in result)
{
if (VARIABLE.Groups.Count == 4)
{
Console.WriteLine(VARIABLE.Groups[2].Value);
res.Add(VARIABLE.Groups[2].Value);
}
}
return res;
}
else
return null;
}
/// <summary>
/// 如果str含有 正则表达式特殊字符 ,则替换为普通字符 "[" => "\\["
/// </summary>
public static string ToNomalStr(this string str)
{
var dict = new Dictionary<string, string>()
{
//在C#语言中: "\\[" == @"\[" ,为了表示\所以多加一个斜杠
{ @"\",@"\\" },
{ "[",@"\[" },
{ "]",@"\]" },
{ "(",@"\(" },
{ ")",@"\)" },
{ "{",@"\{" },
{ "}",@"\}" },
{ "^",@"\^" },
{ "$",@"\$" },
{ "|",@"\|" },
{ "-",@"\-" },
{ "+",@"\+" },
{ "*",@"\*" },
{ "?",@"\?" },
{ "/",@"\/" },
{ "<",@"\<" },
{ ">",@"\>" },
};
foreach (var item in dict)
str = str.Replace(item.Key, item.Value);
return str;
}
匹配后替换
匹配表达式时:()括号包起来的表达式表示一个分组,第二个括号包起来的就是第二个分组,以此类推。分组从0开始,默认第0个分组,表示整个字符串.
替换表达式时:$1 和 \1 表示的意思相同(引用匹配到的第一个分组),\5或者$5就表示引用第5个分组。
\0表示整个字符串 Match.Groups[0].Value
在C#中 整个字符串 代表第一个分组 ,第二括号表示第二个分组 ,
复制:
查找表达式:"(.+)"
替换表达式:是($1),就是($1),还是($1),这个就是复制($1)
字符串:当我看见"他"了
替换后的字符串:当我看见是他,就是他,还是他,这个就是复制他了
替换
.