- 浏览: 301166 次
- 性别:
- 来自: 北京
-
文章分类
最新评论
-
全站唯一是我么:
请问下该功能的jdk版本是1.4的么,还是以上的?
Java实现给图片添加水印 -
Janne:
请问,你解决这问题没?是怎么回事?我今天也遇到了,没解决
myeclipse6.5中使用jax-ws启动tomcat报错问题 -
xuedong:
studypi 写道你是怎么和新浪的技术联系的?能告诉一下我吗 ...
新浪微博第三方接口调用学习 -
studypi:
你是怎么和新浪的技术联系的?能告诉一下我吗,谢谢
新浪微博第三方接口调用学习 -
dove19900520:
有用,呵呵
IE,Firefox都不放弃(兼容性问题总结)
1 概述
匹配模式指的是一些可以改变正则表达式匹配行为的选项或修饰符。不同的语言支持的匹配模式不同,使用的方式也不同。
一般可分为全局和内联两种。下面主要介绍.NET中的匹配模式,其它语言的匹配模式,后续视情况补充。
2 匹配模式
2.1 全局匹配模式和内联匹配模式概述
.NET中的全局匹配模式是通过RegexOptions 枚举值指定的,可以按位“或”进行组合,全局匹配模式只能作用于整个正则表达式。全局匹配模式提供的模式更多,可以灵活的动态指定匹配模式。
而内联匹配模式是通过在正则表达式中,使用(?imnsx-imnsx:)或(?imnsx-imnsx)的分组构造来改变正则表达式的匹配行为的。内联匹配模式更灵活、简洁,但是提供的模式较少。
下表摘自MSDN,部分说明做了修改。
RegexOption 成员 |
内联字符 |
说明 |
None |
N/A |
指定不设置任何选项。 |
IgnoreCase |
i |
指定不区分大小写的匹配。 |
Multiline |
m |
指定多行模式。更改 ^ 和 $ 的含义,以使它们分别与任何行的开头和结尾匹配,而不只是与整个字符串的开头和结尾匹配。 |
ExplicitCapture |
n |
指定唯一有效的捕获是显式命名或编号的 (?<name>…) 形式的组。这允许圆括号充当非捕获组,从而避免了由 (?:…) 导致的语法上的笨拙。 |
Compiled |
N/A |
指定正则表达式将被编译为程序集。生成该正则表达式的 Microsoft 中间语言 (MSIL) 代码;以较长的启动时间为代价,得到更快的执行速度。 |
Singleline |
s |
指定单行模式。更改句点字符 (.) 的含义,以使它与每个字符(而不是除 /n 之外的所有字符)匹配。 |
IgnorePatternWhitespace |
x |
指定从模式中排除非转义空白并启用数字符号 (#) 后面的注释。请注意,空白永远不会从字符类中消除。 |
RightToLeft |
N/A |
指定搜索是从右向左而不是从左向右进行的。具有此选项的正则表达式将移动到起始位置的左边而不是右边。 |
ECMAScript |
N/A |
指定已为表达式启用了符合 ECMAScript 的行为。此选项仅可与 IgnoreCase 和 Multiline 标志一起使用。将 ECMAScript 同任何其他标志一起使用将导致异常。 |
CultureInvariant |
N/A |
指定忽略语言中的区域性差异。 |
2.2 全局匹配模式
下面根据各种模式使用的频率进行讲解。
2.2.1 IgnoreCase 忽略大小写
几乎所有支持正则的语言中都提供了这一模式,是应用最多的模式之一,同时也是被“滥”用最多的模式之一。
开启忽略大小写模式,则字符可以同时匹配大写或小写形式。比如在此模式下,正则表达式“<br>”可同时匹配“<br>”和“<BR>”
但并不是所有的字符都有大小写形式,所以在书写的正则中,如果不存在可区分大小写形式的元字符或是字符序列时,开启这一模式是没有任何意义的。
比如替换一般的html标签的正则表达式
string result = Regex.Replace(srcStr, @"<[^>]*>", "", RegexOptions.IgnoreCase);
因为<[^>]*>没有哪一个元字符或是字符序列具有大小写形式,所以这里的RegexOptions.IgnoreCase是多余的,用在这里虽然不会改变匹配结果,但是会降低匹配效率,同时这也不是一个好的习惯。
只有在正则表达式中,注意是正则表达式中,而不是待匹配的源字符串中,涉及到大小写形式的元字符或是字符序列时,才使用IgnoreCase模式。
2.2.2 Multiline 多行模式
多行模式改变的是“^”和“$”的匹配行为,使“^”和“$”不仅可以匹配整个字符串的开始和结束位置,还可以匹配每行的开始和结束位置。
首先说明一下“行”的范围。虽然我们在程序中习惯用“/r/n”来表示换行,但实际上“/r”和“/n”是不相关的两个字符,一个表示回车,一个表示换行。由于历史原因,“/r”并不是所有系统都支持的,所以“行”是由“/n”来分割的,其中“/n”属于前一“行”,而不属于后一“行”。
举例来说,字符串“a/r/nbc/r/n”共有三行,“a/r/n”为一行,“bc/r/n”为一行,最后还有一个“”空行。
2.2.2.1 在不开启多行模式情况下,“^”和“$”匹配范围
“^”的匹配范围
MatchCollection mc = Regex.Matches("a/r/nbc/r/n", @"^");
foreach (Match m in mc)
{
richTextBox2.Text += "匹配内容:" + m.Value + " 匹配开始索引:" + m.Index + " 匹配长度:" + m.Length + "/n";
}
/*--------输出--------
匹配内容: 匹配开始索引:0 匹配长度:0
*/
“$”的匹配范围
MatchCollection mc = Regex.Matches("a/r/nbc/r/n", @"$");
foreach (Match m in mc)
{
richTextBox2.Text += "匹配内容:" + m.Value + " 匹配开始索引:" + m.Index + " 匹配长度:" + m.Length + "/n";
}
/*--------输出--------
匹配内容: 匹配开始索引:6 匹配长度:0
匹配内容: 匹配开始索引:7 匹配长度:0
*/
注意:这里需要注意的是,在没有开启多行模式时,字符串结尾如果是“/n”,那么“$”是可以匹配两个位置的,一个是“/n”前的位置,一个是字符串结束位置。字符串结尾如果不是“/n”,那么“$”就只匹配字符串结束位置。
MatchCollection mc = Regex.Matches("a/r/nbc/r", @"$");
foreach (Match m in mc)
{
richTextBox2.Text += "匹配内容:" + m.Value + " 匹配开始索引:" + m.Index + " 匹配长度:" + m.Length + "/n";
}
/*--------输出--------
匹配内容: 匹配开始索引:6 匹配长度:0
*/
2.2.2.2 在开启了多行模式后,“^”和“$”匹配范围
“^”的匹配范围
MatchCollection mc = Regex.Matches("a/r/nbc/r/n", @"^", RegexOptions.Multiline);
foreach (Match m in mc)
{
richTextBox2.Text += "匹配内容:" + m.Value + " 匹配开始索引:" + m.Index + " 匹配长度:" + m.Length + "/n";
}
/*--------输出--------
匹配内容: 匹配开始索引:0 匹配长度:0
匹配内容: 匹配开始索引:3 匹配长度:0
匹配内容: 匹配开始索引:7 匹配长度:0
*/
“$”的匹配范围
MatchCollection mc = Regex.Matches("a/r/nbc/r/n", @"$", RegexOptions.Multiline);
foreach (Match m in mc)
{
richTextBox2.Text += "匹配内容:" + m.Value + " 匹配开始索引:" + m.Index + " 匹配长度:" + m.Length + "/n";
}
/*--------输出--------
匹配内容: 匹配开始索引:2 匹配长度:0
匹配内容: 匹配开始索引:6 匹配长度:0
匹配内容: 匹配开始索引:7 匹配长度:0
*/
2.2.2.3 匹配结果分析
“^”匹配结果分析
在不开启多行模式时,“^”只匹配字符串的开始位置,也就是位置0。
在开启了多行模式后,“^”匹配字符串开始位置和每个“/n”之后的行起始位置。
“$”匹配结果分析
在不开启多行模式时,如果字符结尾是“/n”,那么“$”会匹配结尾“/n”之前和结束两个位置。
在开启多行模式后,“$”匹配每行“/n”之前的位置和字符串结束位置。
需要注意的是,在.NET中,无论是否开启多行模式,“^”和“$”匹配的都只是一个位置,是零宽度的。其它语言中“^”和“$”的意义可能会有所不同。
只有在正则表达式中涉及到多行的“^”和“$”的匹配时,才使用Multiline模式。
2.2.2.4 应用举例
典型应用一(参考 正则中加字符的问题):
需求描述:
fffffffffff
fffffffffff
dfdfdfdf
erererere
ferewfdfds
每行后面加一个“ttt”,即为
fffffffffffttt
fffffffffffttt
dfdfdfdfttt
ererererettt
ferewfdfdsttt
代码实现:
string result = Regex.Replace(yourStr, @"^.*$", "$0ttt", RegexOptions.Multiline);
典型应用二
需求描述:
源字符串
CODE39/CODE93:
A-Z
space,-,.,$,/,+,%
CODE128A:
A-Z
0-9
space,!,",#,$,%,&,…,(,)*,+,逗号,-,.,/, <,=,>,?,@,[,],^,_
CODE128B:
A-Z
a-z
0-9
space,!,",#,$,%,&,…,(,)*,+,逗号,-,.,/, <,=,>,?,@,[,],^,_,{,},|,~
CODE2of5:
0-9
说明:
CODE128A:->条码类别
A-Z
0-9
space,!,",#,$,%,&,…,(,)*,+,逗号,-,.,/, <,=,>,?,@,[,],^,_->表示范围
要求分别匹配出条码类别和表示范围
代码实现:
MatchCollection mc = Regex.Matches(yourStr, @"(?<type>[^/n:]+):/s*(?<range>(^(?!/s*$).*$/n?)*)", RegexOptions.Multiline);
foreach (Match m in mc)
{
richTextBox2.Text += "条码类别: /n" + m.Groups["type"].Value + "/n";
richTextBox2.Text += "表示范围: /n" + m.Groups["range"].Value + "/n";
}
/*--------输出--------
条码类别:
CODE39/CODE93
表示范围:
A-Z
space,-,.,$,/,+,%
条码类别:
CODE128A
表示范围:
A-Z
0-9
space,!,",#,$,%,&,…,(,)*,+,逗号,-,.,/, <,=,>,?,@,[,],^,_
条码类别:
CODE128B
表示范围:
A-Z
a-z
0-9
space,!,",#,$,%,&,…,(,)*,+,逗号,-,.,/, <,=,>,?,@,[,],^,_,{,},|,~
条码类别:
CODE2of5
表示范围:
0-9
*/
2.2.3 Singleline 单行模式
单行模式改变的是小数点“.”的匹配行为,使小数点可以匹配包含换行符“/n”在内的任意一个字符。
这是一个很不幸的命名,总让人误会它与Multiline多行模式是有关联的,而事实上它改变的是小数点的匹配行为,与Multiline多行模式没有任何关联,由于历史原因,这一不幸的命名被保留了下来。使用时需要注意。
单行模式通常在匹配有换行的文本时使用,采用小数点+单行模式的方式匹配任意字符,在.NET中是效率最高的。参考 正则基础之——小数点。
典型应用:
源字符串:
<a>There is one obvious advantage:</a>
<div>
<p>
You've seen it coming!<br/>
Buy now and get nothing for free!<br/>
Well, at least no free beer. Perhaps a bear,<br/>
if you can afford it.
</p>
</div>
<a>Now that you've got...</a>
<div>
<p>
your bear, you have to admit it!<br/>
No, we aren't selling bears.
</p>
</div>
需求:取<div>标签之间的内容
代码实现:
MatchCollection mc = Regex.Matches(yourStr, @"<div[^>]*>(?:(?!</div/b).)*</div>", RegexOptions.Singleline|RegexOptions.IgnoreCase);
foreach (Match m in mc)
{
richTextBox2.Text += m.Value + "/n-------------------/n";
}
/*--------输出--------
<div>
<p>
You've seen it coming!<br/>
Buy now and get nothing for free!<br/>
Well, at least no free beer. Perhaps a bear,<br/>
if you can afford it.
</p>
</div>
-------------------
<div>
<p>
your bear, you have to admit it!<br/>
No, we aren't selling bears.
</p>
</div>
-------------------
*/
2.2.4 Compiled 编译模式
Compiled改变的是.NET中正则表达式的编译方式。启用了Compiled模式,会延长启动时间,占用更多的内存,会提高匹配速度。当然,对最终性能的影响,需要根据具体问题综合考虑的。这一模式也是被“滥”用最多的模式之一。
程序运行过程中,第一次遇到正则表达式,需要加载正则引擎,对正则表达式进行必要的语法检查,并做适当的优化,最后把它转换为适合正则引擎应用的形式。这种“解析”过程,对于复杂的正则表达式,频繁调用或是匹配较大的数据源时,对效率的影响较大。
这时可以在构建正则表达式时开启Compiled模式。这样做会将正则表达式直接编译为MSIL代码,在正则匹配过程中,可以由JIT优化为更快的本地机器代码,获得更高的匹配速度。但这种方式会降低正则的解析速度,占用更多的内存,而且它占用的内存在程序运行过程中会一直占用,无法释放。
什么场景下使用Compiled模式,需要根据实际情况具体问题具体分析,一般来说,以下场景不适合使用Compiled模式:
1. 对匹配效率没有要求的场景;
2. 非常简单的正则表达式;
3. 极少调用的方法中声明的正则表达式;
4. 循环体中声明的正则表达式(除了动态生成的正则表达式,否则不要在循环体内声明正则表达式);
5. 静态方法中声明的正则表达式(静态方法每次调用都需要重新编辑正则表达式,使用Compiled模式只会降低效率)。
2.2.5 RightToLeft 从右到左模式
RightToLeft改变的是正则表达式匹配的顺序,从右到左进行匹配。目前只有.NET支持这一模式,但它对这一模式的支持并不是很完善,有时容易让人费解,所以除非对源字符串的构成很了解,而且又不得不使用的情况,否则不要轻易使用这一模式。
典型应用(参考 求一个好的算法):
一个由字母组成的字符串,最长14位,要求每隔2位加一个逗号,最左边不加,求一个好的算法
例:“abcdefg” 返回“a,bc,de,fg”
代码实现:
string test = "abcdefg";
string result = Regex.Replace(yourStr, @"(?<!^)[a-zA-Z]{2}", ",$0", RegexOptions.RightToLeft);
2.2.6 None
这一模式指定不开启任何模式。在.NET中RegexOptions 枚举值是按位“或”组合,None模式我目前只找到一种应用场景,就是在动态生成正则表达式时,动态指定模式时使用。
/// <summary>
/// 动态生成正则参数列表
/// </summary>
/// <returns></returns>
private RegexOptions getParameter()
{
RegexOptions roList = RegexOptions.None;
if (cbIgnoreCase.Checked)
{
roList = roList | RegexOptions.IgnoreCase;
}
if (cbSingleline.Checked)
{
roList = roList | RegexOptions.Singleline;
}
if (cbMultiline.Checked)
{
roList = roList | RegexOptions.Multiline;
}
if (cbCompiled.Checked)
{
roList = roList | RegexOptions.Compiled;
}
if (cbRightToLelft.Checked)
{
roList = roList | RegexOptions.RightToLeft;
}
return roList;
}
2.2.7 ExplicitCapture
这一模式改变的是普通捕获组的匹配行为。将普通捕获组解释为非捕获组,只有显式命名的命名捕获组才当作捕获组使用。
捕获组的作用是将括号()内子表达式匹配到的内容保存到内存中一个组里,供以后引用,在.NET中捕获组有两种形式
(Expression) 普通捕获组
(?<name>Expression) 命名捕获组
其它形式的(?...)都不是捕获组。
但是(Expression)这种捕获组语法规则也带来一个副作用,在一些不得不使用()的场合,会默认为使用了捕获组,将匹配到的内容保存到内存中,而有些情况下这些内容并不需要关心的,浪费了系统资源,降低了匹配效率,所以才有了非捕获组(?:Expression)的出现,来抵消这一副作用。而非捕获组带来的另一个副作用的就是可读性的降低。
ExplicitCapture模式是为了在不牺牲匹配效率的前提下,提高正则表达式的可读性,一般在命名捕获组和普通捕获组混合出现,而又不关心普通捕获组的正则表达式中使用,如取链接和文字的正则表达式中
MatchCollection mc = Regex.Matches(yourStr, @"(?is)<a((?!href=).)*href=(?<s>['""]?)(?<url>[^""'/s>]*)/k<s>[^>]*>(?<text>((?!</a>).)*)</a>", RegexOptions.ExplicitCapture);
foreach (Match m in mc)
{
richTextBox2.Text += m.Groups["url"].Value + "/n";
richTextBox2.Text += m.Groups["text"].Value + "/n";
}
开启ExplicitCapture模式对正则表达式解释行为的影响,可以参考如下举例,匹配时间的正则表达式
未开启ExplicitCapture模式
string test = "<li title=/"截至2009-07-28 20:45:49,用户的总技术分为:5988;截至2009-07-26日,用户的总技术分排名为:4133/">(...)</li>";
Regex reg = new Regex(@"([01][0-9]|2[0-3])(:[0-5][0-9]){2}");
MatchCollection mc = reg.Matches(test);
foreach (Match m in mc)
{
richTextBox2.Text += m.Value + "/n";
richTextBox2.Text += m.Groups[1].Value + "/n";
richTextBox2.Text += m.Groups[2].Value + "/n";
}
/*--------输出--------
20:45:49
20
:49
*/
开启ExplicitCapture模式
string test = "<li title=/"截至2009-07-28 20:45:49,用户的总技术分为:5988;截至2009-07-26日,用户的总技术分排名为:4133/">(...)</li>";
Regex reg = new Regex(@"([01][0-9]|2[0-3])(:[0-5][0-9]){2}");
MatchCollection mc = reg.Matches(test);
foreach (Match m in mc)
{
richTextBox2.Text += m.Value + "/n";
richTextBox2.Text += m.Groups[1].Value + "/n";
richTextBox2.Text += m.Groups[2].Value + "/n";
}
/*--------输出--------
20:45:49
*/
一般来说,关心的只是整个正则表达式匹配的整体,启用了ExplicitCapture模式后,“([01][0-9]|2[0-3])”和“(:[0-5][0-9])”将不会被解释为捕获组,匹配到的内容也不会保存到内存中。
开启ExplicitCapture模式虽然可以提高正则表达式的可读性,但ExplicitCapture这一模式本身容易被人忽略,所以这种模式应用得也比较少。
一旦使用了ExplicitCapture模式,要注意的是,除非你清楚捕获组的编号规则,否则尽量不要再使用/number方式进行反向引用,可以使用/k<name>方式进行反向引用。
Regex reg = new Regex(@"href=(['""]?)(?<url>[^'""/s>]+)/1", RegexOptions.ExplicitCapture);
MatchCollection mc = reg.Matches(yourStr);
foreach (Match m in mc)
{
richTextBox2.Text += m.Value + "/n";
}
以上匹配链接的代码通常是得不到任何结果的,因为这里“/1”引用的内容,不再是“(['""]?)”匹配到的内容,而是“(?<url>[^'""/s>]+)”匹配到的内容,等价于“(?<url>[^'""/s>]+)/k<url>”,而这样的字符串,通常是不存在的。
2.2.8 IgnorePatternWhitespace
这一模式忽略正则表达式中的非转义空白字符,并启用“#”后面的注释,通常用于增强正则表达式的可读性或是用于教学目的。
举个例子基本上就会明白了
string test = "(One) and ( Two (Three) Four).";
Regex reg = new Regex(@"/( #普通开括弧
(?> #固化分组
/( (?<OPEN>) #遇到开括弧'OPEN'计数加1
| #分支结构
/) (?<-OPEN>) #遇到闭括弧'OPEN'计数减1
| #分支结构
[^()]+ #非括弧的其它任意字符
)* #以上子串出现0次或任意多次
(?(OPEN)(?!)) #判断是否还有'OPEN',有则说明不配对,什么都不匹配
/) #普通闭括弧
", RegexOptions.IgnorePatternWhitespace);
MatchCollection mc = reg.Matches(test);
foreach (Match m in mc)
{
richTextBox2.Text += m.Value + "/n";
}
其中的空白字符被忽略,“#”及该行后面的内容被解释为注释。
2.2.9 ECMAScript
这一模式将按ECMA的JavaScript语义来解析正则表达式。通常影响的是以下元字符的匹配行为
/w、/W、/d、/D、/s、/S
使得以上元字符只能匹配ASCII码字符,而不再是匹配相应的Unicode字符。
事实上比如需求中明确要求只匹配英文字母,数字,下划线,而不包含汉字等字符,那么完全可以用“[A-Za-z0-9_]”,而不使用“/w”,虽然不够简洁,但可读性更好,语义更明确。
这一模式在.NET中的应用比较少,如不清楚什么场景下应该使用,可以忽略这一模式。
2.2.10 CultureInvariant
这一模式指定忽略语言中的区域性差异。一般与IgnoreCase模式一起使用,这一模式的应用场景很少,一般可以忽略,无需了解。
2.3 内联匹配模式
内联匹配模式在正则表达式内部使用,可以改变局部子表达式的匹配行为,内联匹配模式支持的模式较少,仅有immsx五种,但使用起来更简洁,更灵活。在.NET中支持(?imnsx-imnsx:)和(?imnsx-imnsx)两种形式。
各内联匹配模式对应的全局匹配模式见匹配模式列表。以下仅就(?i)忽略大小写模式进行讲解,其它模式类同。
2.3.1 (?imnsx-imnsx:)形式
语法:(?i:Expression)
这种语法规则表达为括号内的子表达式开启忽略大小写模式。
举例:^[A-Z](?i:[A-Z]{9,19})$
以上正则表示,首字符必须为大写字母,后面跟9到19个大小写字母。
string[] test = new string[] { "Abc", "AbcdefGHIjklmn", "abcdefghijklmn" };
Regex reg = new Regex(@"^[A-Z](?i:[A-Z]{9,19})$");
foreach (string s in test)
{
richTextBox2.Text += "源字符串: " + s.PadRight(15, ' ') + " 匹配结果: " + reg.IsMatch(s) + "/n";
}
/*--------输出--------
源字符串: Abc 匹配结果: False
源字符串: AbcdefGHIjklmn 匹配结果: True
源字符串: abcdefghijklmn 匹配结果: False
*/
语法:(?-i:Expression)
这种语法规则表达为括号内的子表达式关闭忽略大小写模式。通常与全局匹配模式配合使用,表示全局为忽略大小写的,局部为严格区分大小写。
举例:<div id="(?-i:TEST)" [^>]*>[/w/s]+</div>
以上正则表示,div标签中,仅匹配id为全大写的“TEST”的标签内容,其余标签不匹配。
string test = "<DIV id=/"Test/" class=/"create/">first</div> and <DIV id=/"TEST/" class=/"delete/">second</div>";
Regex reg = new Regex(@"<div id=""(?-i:TEST)""[^>]*>[/w/s]+</div>", RegexOptions.IgnoreCase);
MatchCollection mc = reg.Matches(test);
foreach(Match m in mc)
{
richTextBox2.Text += m.Value + "/n";
}
/*--------输出--------
<DIV id="TEST" class="delete">second</div>
*/
2.3.2 (?imnsx-imnsx)
语法:(?i) 或 (?-i)
(?i)为所在位置右侧的子表达式开启忽略大小写模式,直到出现(?-i)或者到表达式结束为止;(?-i)为所在位置右侧的子表达式关闭忽略大小写模式,直到出现(?i)或者到表达式结束为止。
通常在正则表达式开始位置使用(?i)来代替RegexOptions.IgnoreCase,使代码更简洁。如提取链接和文字的正则表达式
MatchCollection mc = Regex.Matches(yourStr, @"(?is)<a(?:(?!href=).)*href=(['""]?)(?<url>[^""'/s>]*)/1[^>]*>(?<text>(?:(?!</a>).)*)</a>");
foreach (Match m in mc)
{
richTextBox2.Text += m.Groups["url"].Value + "/n";
richTextBox2.Text += m.Groups["text"].Value + "/n";
}
3 小结
.NET中的正则匹配模式基本上已讲解完了,最后再来总结一下各匹配模式的应用场景吧。
.NET中的正则匹配模式基本上已讲解完了,最后再来总结一下各匹配模式的应用场景吧。 RegexOption 成员 内联字符 作用/应用场景 None N/A 指定不设置任何选项。 一般在动态指定匹配模式时使用。 IgnoreCase i 指定不区分大小写的匹配。 只有在正则表达式中,注意是正则表达式中,而不是待匹配的源字符串中,涉及到大小写形式的元字符或是字符序列时,才使用IgnoreCase模式。 Multiline m 指定多行模式。更改 ^ 和 $ 的含义,以使它们分别与任何行的开头和结尾匹配,而不只是与整个字符串的开头和结尾匹配。 只有在正则表达式中涉及到多行的“^”和“$”的匹配时,才使用Multiline模式。 ExplicitCapture n 指定唯一有效的捕获是显式命名或编号的 (?<name>…) 形式的组。这允许圆括号充当非捕获组,从而避免了由 (?:…) 导致的语法上的笨拙。 ExplicitCapture模式是为了在不牺牲匹配效率的前提下,提高正则表达式的可读性,一般在命名捕获组和普通捕获组混合出现,而又不关心普通捕获组的正则表达式中使用。 Compiled N/A 指定正则表达式将被编译为程序集。生成该正则表达式的 Microsoft 中间语言 (MSIL) 代码;以较长的启动时间为代价,得到更快的执行速度。 以下场景不适合使用: 1. 对匹配效率没有要求的场景; 2. 非常简单的正则表达式; 3. 极少调用的方法中声明的正则表达式; 4. 循环体中声明的正则表达式(除了动态生成的正则表达式,否则不要在循环体内声明正则表达式); 5. 静态方法中声明的正则表达式(静态方法每次调用都需要重新编辑正则表达式,使用Compiled模式只会降低效率)。 Singleline s 指定单行模式。更改句点字符 (.) 的含义,以使它与每个字符(而不是除 /n 之外的所有字符)匹配。 单行模式通常在匹配有换行的文本时使用,采用小数点+单行模式的方式匹配任意字符,在.NET中是效率最高的。 IgnorePatternWhitespace x 指定从模式中排除非转义空白并启用数字符号 (#) 后面的注释。请注意,空白永远不会从字符类中消除。 为了提高可读性,或是为正则表达式加注释时使用。 RightToLeft N/A 指定搜索是从右向左而不是从左向右进行的。具有此选项的正则表达式将移动到起始位置的左边而不是右边。 除非对源字符串的构成很了解,而且又不得不使用的情况,否则不要轻易使用这一模式。 ECMAScript N/A 指定已为表达式启用了符合 ECMAScript 的行为。此选项仅可与 IgnoreCase 和 Multiline 标志一起使用。将 ECMAScript 同任何其他标志一起使用将导致异常。 除非对这一模式应用场景很了解,否则不要使用。 CultureInvariant N/A 指定忽略语言中的区域性差异。 很少使用,一般无需了解。
转自:http://blog.csdn.net/lxcnn/article/details/4395945
RegexOption 成员 |
内联字符 |
作用/应用场景 |
None |
N/A |
指定不设置任何选项。 一般在动态指定匹配模式时使用。 |
IgnoreCase |
i |
指定不区分大小写的匹配。 只有在正则表达式中,注意是正则表达式中,而不是待匹配的源字符串中,涉及到大小写形式的元字符或是字符序列时,才使用IgnoreCase模式。 |
Multiline |
m |
指定多行模式。更改 ^ 和 $ 的含义,以使它们分别与任何行的开头和结尾匹配,而不只是与整个字符串的开头和结尾匹配。 只有在正则表达式中涉及到多行的“^”和“$”的匹配时,才使用Multiline模式。 |
ExplicitCapture |
n |
指定唯一有效的捕获是显式命名或编号的 (?<name>…) 形式的组。这允许圆括号充当非捕获组,从而避免了由 (?:…) 导致的语法上的笨拙。 ExplicitCapture模式是为了在不牺牲匹配效率的前提下,提高正则表达式的可读性,一般在命名捕获组和普通捕获组混合出现,而又不关心普通捕获组的正则表达式中使用。 |
Compiled |
N/A |
指定正则表达式将被编译为程序集。生成该正则表达式的 Microsoft 中间语言 (MSIL) 代码;以较长的启动时间为代价,得到更快的执行速度。 以下场景不适合使用: 1. 对匹配效率没有要求的场景; 2. 非常简单的正则表达式; 3. 极少调用的方法中声明的正则表达式; 4. 循环体中声明的正则表达式(除了动态生成的正则表达式,否则不要在循环体内声明正则表达式); 5. 静态方法中声明的正则表达式(静态方法每次调用都需要重新编辑正则表达式,使用Compiled模式只会降低效率)。 |
Singleline |
s |
指定单行模式。更改句点字符 (.) 的含义,以使它与每个字符(而不是除 /n 之外的所有字符)匹配。 单行模式通常在匹配有换行的文本时使用,采用小数点+单行模式的方式匹配任意字符,在.NET中是效率最高的。 |
IgnorePatternWhitespace |
x |
指定从模式中排除非转义空白并启用数字符号 (#) 后面的注释。请注意,空白永远不会从字符类中消除。 为了提高可读性,或是为正则表达式加注释时使用。 |
RightToLeft |
N/A |
指定搜索是从右向左而不是从左向右进行的。具有此选项的正则表达式将移动到起始位置的左边而不是右边。 除非对源字符串的构成很了解,而且又不得不使用的情况,否则不要轻易使用这一模式。 |
ECMAScript |
N/A |
指定已为表达式启用了符合 ECMAScript 的行为。此选项仅可与 IgnoreCase 和 Multiline 标志一起使用。将 ECMAScript 同任何其他标志一起使用将导致异常。 除非对这一模式应用场景很了解,否则不要使用。 |
CultureInvariant |
N/A |
指定忽略语言中的区域性差异。 很少使用,一般无需了解。 |
转自:http://blog.csdn.net/lxcnn/article/details/4656599
发表评论
-
(从网上考过来的,收藏) javascript 正则表达式的贪婪与非贪婪
2012-10-08 10:35 910以下内容转自:http://www.cnitblog.com ... -
正则表达式常用验证
2011-08-24 12:20 867在前台很多地方需要验证输入格式,为了方便以后使用,把常用的整理 ... -
正则判断一个字符串里是否包含一些词
2011-08-16 16:53 3287今天项目里用到了正则,判断一个字符串里是不是包含这些词,词出 ... -
js取当前url参数
2011-07-19 11:14 1965js没有提供取当前url参数的方法,只能是自己从中截取了,在 ... -
正则手册
2011-07-07 16:53 1041给大家共享个正则手册 欢迎查看本人博客: ... -
[ ] 字符组(Character Classes) .
2011-07-06 17:31 846[]能够匹配所包含的一系列字符中的任意一个。需要注意的是,[ ... -
正则基础之——捕获组(capture group) .
2011-07-06 17:30 10321 概述 1.1 什么是捕获组 ... -
正则表达式学习参考
2011-07-06 17:28 797正则表达式学习参考 1 ... -
正则基础之——小数点 .
2011-07-06 17:23 806小数点可以匹配除了换行符“/n”以外的任意一个字符 一 ... -
正则基础之——NFA引擎匹配原理 .
2011-07-06 17:22 1017NFA引擎匹配原理 1 ... -
正则基础之——环视 .
2011-07-06 17:21 588环视只进行子表达式的匹配,不占有字符,匹配到的内容不保存到最终 ... -
正则基础之——/b 单词边界 .
2011-07-06 17:20 8391 概述 “/b”匹配单词边界,不匹配任何 ... -
正则应用之——日期正则表达式
2011-07-06 17:18 10921 概述 首先需要说明的一点,无论是Win ... -
.NET正则基础之——平衡组 .
2011-07-06 17:14 18351 概述 平衡组是微软在.NET中提出的一 ... -
正则基础之——非捕获组 .
2011-07-06 17:10 1385非捕获组:(?:Expression) 接触正则表达式不久的 ... -
正则基础之——反向引用 .
2011-07-06 17:09 13491 概述 捕获组捕获到的内容,不仅可以在 ... -
.NET正则基础——.NET正则类及方法应用 .
2011-07-06 17:07 11191 概述 初学 ... -
NET正则基础之——正则委托 .
2011-07-06 17:05 8611 概述 一般的正则替换,只能对匹配的子串做 ... -
正则基础之——贪婪与非贪婪模式 .
2011-07-06 17:03 9811 概述 贪婪 ... -
正则应用之——逆序环视探索
2011-07-06 17:01 12311 问题引出 前几天在CSDN论坛遇到这样 ...
相关推荐
查看进程信息,方便排查问题
IDA Pro分析STM32F1xx插件
项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用
小型的微电网仿真模型,简单模拟了光伏,家庭负载变化的使用情况
MATLAB代码实现:分布式电源接入对配电网运行影响深度分析与评估,MATLAB代码分析:分布式电源接入对配电网运行影响评估,MATLAB代码:分布式电源接入对配电网影响分析 关键词:分布式电源 配电网 评估 参考文档:《自写文档,联系我看》参考选址定容模型部分; 仿真平台:MATLAB 主要内容:代码主要做的是分布式电源接入场景下对配电网运行影响的分析,其中,可以自己设置分布式电源接入配电网的位置,接入配电网的有功功率以及无功功率的大小,通过牛顿拉夫逊法求解分布式电源接入后的电网潮流,从而评价分布式电源接入前后的电压、线路潮流等参数是否发生变化,评估配电网的运行方式。 代码非常精品,是研究含分布式电源接入的电网潮流计算的必备程序 ,分布式电源; 配电网; 接入影响分析; 潮流计算; 牛顿拉夫逊法; 电压评估; 必备程序。,基于MATLAB的分布式电源对配电网影响评估系统
项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用
重庆市农村信用合作社 农商行数字银行系统建设方案.ppt
光伏并网逆变器设计方案与高效实现:结合matlab电路仿真、DSP代码及环流抑制策略,光伏并网逆变器设计方案:结合matlab电路文件与DSP程序代码,实现高效并联环流抑制策略,光伏并网逆变器设计方案,附有相关的matlab电路文件,以及DSP的程序代码,方案、仿真文件、代码三者结合使用效果好,事半功倍。 备注:赠送逆变器并联环流matlab文件,基于矢量控制的环流抑制策略和下垂控制的环流抑制 ,光伏并网逆变器设计方案; MATLAB电路文件; DSP程序代码; 方案、仿真文件、代码结合使用; 并联环流抑制策略; 下垂控制的环流抑制,光伏并网逆变器优化设计:方案、仿真与DSP程序代码三合一,并赠送并联环流抑制策略Matlab文件
内容概要:本文介绍了通过 Matlab 实现鲸鱼优化算法(WOA)与门控循环单元(GRU)结合的多输入分类预测模型。文章首先概述了时间序列预测的传统方法局限性以及引入 WOA 的优势。然后,重点阐述了项目背景、目标、挑战及其独特之处。通过详细介绍数据预处理、模型构建、训练和评估步骤,最终展示了模型的效果预测图及应用实例。特别强调利用 WOA 改善 GRU 的参数设置,提高了多输入时间序列预测的准确性与鲁棒性。 适合人群:对时间序列分析有兴趣的研究者,从事金融、能源、制造业等行业数据分析的专业人士,具备一定的机器学习基础知识和技术经验。 使用场景及目标:本项目旨在开发一个高度准确和稳定的多变量时间序列预测工具,能够用于金融市场预测、能源需求规划、生产调度优化等领域,为企业和个人提供科学决策依据。 其他说明:项目提供的源代码和详细的开发指南有助于学习者快速掌握相关技能,并可根据实际需求调整模型参数以适应不同的业务情境。
项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用
内容概要:本文介绍了Python中基于双向长短期记忆网络(BiLSTM)与AdaBoost相结合的多输入分类预测模型的设计与实现。BiLSTM擅长捕捉时间序列的双向依赖关系,而AdaBoost则通过集成弱学习器来提高分类精度和稳定性。文章详述了该项目的背景、目标、挑战、特色和应用场景,并提供了详细的模型构建流程、超参数优化以及视觉展示的方法和技术要点。此外,还附有完整的效果预测图表程序和具体示例代码,使读者可以快速上手构建属于自己的高效稳定的时间序列预测系统。 适合人群:对深度学习特别是时序数据分析感兴趣的开发者或者科研工作者;正在探索高级机器学习技术和寻求解决方案的企业分析师。 使用场景及目标:适用于希望提升时间序列或多输入数据类别判定准确度的业务情境,比如金融市场的走势预估、医学图像分析中的病变区域判读或是物联网环境监测下设备状态预警等任务。目的是为了创建更加智能且可靠的预测工具,在实际应用中带来更精准可靠的结果。 其他说明:文中提供的所有Python代码片段和方法都可以直接运用于实践中,并可根据特定的问题进行相应调整和扩展,进一步改进现有系统的效能并拓展新的功能特性。
1、文件内容:maven-script-interpreter-javadoc-1.0-7.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/maven-script-interpreter-javadoc-1.0-7.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、更多资源/技术支持:公众号禅静编程坊
在云服务器上搭建MQTT服务器(超详细,一步到位)
复现改进的L-SHADE差分进化算法求解最优化问题详解:附MATLAB源码与测试函数集,复现改进的L-SHADE差分进化算法求解最优化问题详解:MATLAB源码与测试集全攻略,复现改进的L-SHADE差分进化算法求最优化问题 对配套文献所提出的改进的L-SHADE差分进化算法求解最优化问题的的复现,提供完整MATLAB源代码和测试函数集,到手可运行,运行效果如图2所示。 代码所用测试函数集与文献相同:对CEC2014最优化测试函数集中的全部30个函数进行了测试验证,运行结果与文献一致。 ,复现; 改进的L-SHADE差分进化算法; 最优化问题求解; MATLAB源代码; 测试函数集; CEC2014最优化测试函数集,复现改进L-SHADE算法:最优化问题的MATLAB求解与验证
天津大学:深度解读DeepSeek原理与效应.pdf 1.大语言模型发展路线图 2.DeepSeek V2-V3/R1技术原理 3DeepSeek效应 4.未来展望
光伏混合储能微电网能量管理系统模型:基于MPPT控制的光伏发电与一阶低通滤波算法的混合储能系统优化管理,光伏混合储能微电网能量优化管理与稳定运行系统,光伏-混合储能微电网能量管理系统模型 系统主要由光伏发电模块、mppt控制模块、混合储能系统模块、直流负载模块、soc限值管理控制模块、hess能量管理控制模块。 光伏发电系统采用mppt最大跟踪控制,实现光伏功率的稳定输出;混合储能系统由蓄电池和超级电容组合构成,并采用一阶低通滤波算法实现两种储能介质间的功率分配,其中蓄电池响应目标功率中的低频部分,超级电容响应目标功率中的高频部分,最终实现对目标功率的跟踪响应;SOC限值管理控制,根据储能介质的不同特性,优化混合储能功率分配,进一步优化蓄电池充放电过程,再根据超级电容容量特点,设计其荷电状态区分管理策略,避免过充过放,维持系统稳定运行;最后,综合混合储能和系统功率平衡,针对光伏储能微电网的不同工况进行仿真实验,验证控制策略的有效性。 本模型完整无错,附带对应复现文献paper,容易理解,可塑性高 ,光伏; 混合储能系统; 能量管理; MPPT控制; 直流负载;
Matlab算法下的A星路径规划改进版:提升搜索效率,优化拐角并路径平滑处理,Matlab下的A星算法改进:提升搜索效率、冗余拐角优化及路径平滑处理,Matlab算法代码 A星算法 路径规划A* Astar算法仿真 传统A*+改进后的A*算法 Matlab代码 改进: ①提升搜索效率(引入权重系数) ②冗余拐角优化(可显示拐角优化次数) ③路径平滑处理(引入梯度下降算法配合S-G滤波器) ,Matlab算法代码; A星算法; 路径规划A*; Astar算法仿真; 传统A*; 改进A*算法; 提升搜索效率; 冗余拐角优化; 路径平滑处理; 权重系数; S-G滤波器。,Matlab中的A*算法:传统与改进的路径规划仿真研究
项目开发所用的主要提示词模板
项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行;功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用
电力系统暂态稳定性仿真分析:Matlab编程与Simulink模型下的各类故障影响研究,电力系统暂态稳定性仿真分析:Matlab编程与Simulink模型下的各类故障影响研究,电力系统暂态稳定性Matlab编程 Simulink仿真 单机无穷大系统发生各类(三相短路,单相接地,两相接地,两相相间短路)等短路故障,各类(单相断线,两相断线,三相断线)等断线故障,暂态稳定仿真分析 Simulink搭建电力系统暂态仿真模型 通过仿真,观察串联电抗器,并联补偿器,自动重合闸,以及故障切除快慢对暂态稳定性的影响 ,电力系统暂态稳定性; Matlab编程; Simulink仿真; 短路故障; 断线故障; 暂态稳定仿真分析; 仿真模型搭建; 电抗器影响; 补偿器影响; 自动重合闸; 故障切除时间。,Matlab编程与Simulink仿真在电力系统暂态稳定性分析中的应用