正则表达式中问号等特殊字符的转义
在.NET Framework 开发人员指南 的 字符转义 一节 有这样一段话。除 .$ ^ { [ ( | ) * + ? \ 外,其他字符与自身匹配。但是其中并未注明这些字符应该匹配为什么字符。为了方便自己以后查阅,也为了方便网友搜索我就写在这里了。
[Sipo] 点的转义:. ==> \\u002E 美元符号的转义:$ ==> \\u0024 乘方符号的转义:^ ==> \\u005E 左大括号的转义:{ ==> \\u007B 左方括号的转义:[ ==> \\u005B 左圆括号的转义:( ==> \\u0028 竖线的转义:| ==> \\u007C 右圆括号的转义:) ==> \\u0029 星号的转义:* ==> \\u002A 加号的转义:+ ==> \\u002B 问号的转义:? ==> \\u003F 反斜杠的转义:\ ==> \\u005C
*、+ 和 ? 限定符都被称为“贪心的”,因为它们匹配尽可能多的文本。但是,有时您只需要最小的匹配。
例如,您可能搜索 HTML 文档,以查找括在 H1 标记内的气动隔膜泵章节标题。该文本在您的文档中如下:
<H1>Chapter 1 – Introduction to Regular Expressions</H1>
下面的表达式匹配从开始小于符号 (<) 到关闭 H1 标记的大于符号 (>) 之间的所有内容。
/<.*>/
如果您只需要匹配开始 H1 标记,下面的“非贪心”表达式只匹配 <H1>。
/<.*?>/
通过在 *、+ 或 ? 限定符之后放置 ?,该表达式从“贪心”表达式转换为“非贪心”表达式或者最小匹配。
编写所需要的正则表达式时是比较麻烦的事,很容易出错,有时还要转义。
因此可以考虑将一些简单的正则表达式,直接通过气动隔膜泵示例字符串来自动生成。
下面是可变部分仅为数字时,生成方法。
public string GetRegexFromSample(string sSample)
{
string sRegex = sSample;
string sSpecial = "\\.$^{[(|)*+?";
for (int i = 0; i < sSpecial.Length; i++)
{http://www.it168.com/
char ch = sSpecial[i];
int n = (int)ch;
string s = String.Format("\\00{0:X}",n);
sRegex = sRegex.Replace(ch.ToString(), s);
}
Regex reg = new Regex( "(\\d+)", RegexOptions.IgnoreCase);
MatchCollection mc = reg.Matches(sSample);
foreach (Match m in mc)
{
sRegex = sRegex.Replace(m.Groups[1].Value, "\\d+");
}
return sRegex;
}