下面的代码示例使用静态 Regex.IsMatch 方法验证一个字符串是否为有效电子邮件格式。如果字符串包含一个有效的电子邮件地址,则 IsValidEmail 方法返回 true,否则返回 false,但不采取其他任何操作。您可以使用 IsValidEmail,在应用程序将地址存储在数据库中或显示在 ASP.NET 页中之前,筛选出包含无效字符的电子邮件地址。
[C#]
bool IsValidEmail(string strIn)
{
// Return true if strIn is in valid e-mail format.
return Regex.IsMatch(strIn, @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$");
}
2//判断当前文本框是否正整数
public bool IsNumber(string sValue)
{
return
Regex.IsMatch(sValue, @"^[0-9]*[1-9][0-9]*$");
}
使用二:替换
2.清理输入字符串
下面的代码示例使用静态 Regex.Replace 方法从字符串中抽出无效字符。您可以使用这里定义的 CleanInput 方法,清除掉在接受用户输入的窗体的文本字段中输入的可能有害的字符。CleanInput 在清除掉除 @、-(连字符)和 .(句点)以外的所有非字母数字字符后返回一个字符串。
[C#]
String CleanInput(string strIn)
{
// Replace invalid characters with empty strings.
return Regex.Replace(strIn, @"[^\w\.@-]", "");
}
3.更改日期格式
以下代码示例使用 Regex.Replace 方法来用 dd-mm-yy 的日期形式代替 mm/dd/yy 的日期形式。
[C#]
String MDYToDMY(String input)
{
return Regex.Replace(input,
"\\b(?<month>\\d{1,2})/(?<day>\\d{1,2})/(?<year>\\d{2,4})\\b",
"${day}-${month}-${year}");
}
Regex 替换模式
本示例说明如何在 Regex.Replace 的替换模式中使用命名的反向引用。其中,替换表达式 ${day} 插入由 (?<day>...) 组捕获的子字符串。
有几种静态函数使您可以在使用正则表达式操作时无需创建显式正则表达式对象,而 Regex.Replace 函数正是其中之一。如果您不想保留编译的正则表达式,这将给您带来方便。
4
//替换
public void Page1()
{
txtResult2.Text = "";
try
{
Regex mRegex = new Regex(txtRegex2.Text);
txtResult2.Text = mRegex.Replace(txtStr2.Text,txtRegexRe.Text);
}
catch(Exception e)
{
MessageBox.Show("输入的正则式错误,请重新输入!","警告",MessageBoxButtons.OK,MessageBoxIcon.Information);
}
}
使用三:查找
//查找
public void Page2()
{
txtResult1.Text = "";
try
{
Regex mRegex = new Regex(txtRegex1.Text);
MatchCollection mMactchCol = mRegex.Matches(txtStr1.Text);
foreach(Match mMatch in mMactchCol)
{
txtResult1.Text += string.Format("{0} 在第{1}个字符被发现!\r\n",mMatch,mMatch.Index);
}
//分割
string[] sArray = mRegex.Split(txtStr1.Text);
txtSplit.Text = "";
foreach(string sLine in sArray)
{
txtSplit.Text += sLine+"\r\n";
}
}
catch(Exception e)
{
MessageBox.Show("输入的正则式错误,请重新输入!","警告",MessageBoxButtons.OK,MessageBoxIcon.Information);
}
}
使用四:提取
//
网页搜索检测
public
void
Page3()
{
string
sRegex
=
""
;
//
1-根据关键词检索值来设定正则式
try
{
sRegex
=
GetRegex(txtRegex3.Text);
//
MessageBox.Show(sRegex);
Regex mRegex
=
new
Regex(sRegex);
MatchCollection mMactchCol
=
mRegex.Matches(txtStr3.Text);
//
定位
txtResult3.Text
=
""
;
LocData location;
foreach
(Match mMatch
in
mMactchCol)
{
//
直接定位到第i行
string
[] sCodeArray
=
mMatch.ToString().Split(
'
'
);
location
=
new
LocData();
GetLocIndex(txtRegex3.Text,
ref
location);
if
(location.nFindIndex
==
null
)
//
无法定位
{
return
;
}
else
{
string
sResult;
for
(
int
i
=
0
;i
<
location.nFindIndex.Length;i
++
)
{
string
sTemp
=
sCodeArray[location.nFindIndex[i]];
//
得到定位行源代码-过滤其余部分
//
分割原定位行正则式
Regex mRegex1
=
new
Regex(
"
\[\$\][^\$]*\[\^\$\]|\[\$\]
"
);
string
[] sArray
=
mRegex1.Split(location.nFindeValue[i]);
MatchCollection mMactchCol1
=
mRegex.Matches(txtStr3.Text);
//
定位
}
}
break
;
}
}
catch
(Exception e)
{
MessageBox.Show(
"
输入的正则式错误,请重新输入!
"
,
"
警告
"
,MessageBoxButtons.OK,MessageBoxIcon.Information);
}
}
//
1-根据关键词检索值来设定正则式
public
string
GetRegex(
string
sValue)
{
string
sRegex
=
""
;
Regex mRegex
=
new
Regex(
"
\[\$\][^\$]*\[\^\$\]|\[\$\]|\[~\][^~]*\[\^~\]|\[~\]
"
);
string
[] sArray
=
mRegex.Split(sValue);
//
分割
MatchCollection mMactchCol
=
mRegex.Matches(sValue);
//
定位
int
i
=
0
;
Regex replaceReg
=
new
Regex(
"
(?<regex>[\[\]\.\^\$\{\}\(\)\|\*\+\?\\])
"
);
Regex replaceReg1
=
new
Regex(
"
\[\$\](?<regex>[^\$)]*)\[\^\$\]|\[~\](?<regex>[^~]*)\[\^~\]
"
);
//
将前面的字符串过滤特殊字符
sArray[i]
=
replaceReg.Replace(sArray[i],
"
\${regex}
"
);
sRegex
+=
sArray[i];
foreach
(Match mMatch
in
mMactchCol)
{
//
将本查找项替换
if
(mMatch.ToString()
==
"
[$]
"
||
mMatch.ToString()
==
"
[~]
"
)
sRegex
+=
"
(\w|\W)*
"
;
//
任意字符串,不带换行符
else
{
string
sTemp
=
replaceReg1.Replace(mMatch.ToString(),
"
${regex}
"
);
sRegex
+=
sTemp;
//
任意字符串
}
//
将后面的字符串过滤特殊字符
i
++
;
sArray[i]
=
replaceReg.Replace(sArray[i],
"
\${regex}
"
);
sRegex
+=
sArray[i];
}
return
sRegex;
}
//
2-得到行定位数组
public
void
GetLocIndex(
string
sValue,
ref
LocData location)
{
int
[] nFindIndex;
string
[] nFindValue;
string
[] sLineArray
=
sValue.Split(
'
'
);
Regex mRegex
=
new
Regex(
"
\[\$\][^\$]*\[\^\$\]|\[\$\]
"
);
string
sSaveIndex
=
""
;
string
sSaveValue
=
""
;
for
(
int
i
=
0
; i
<
sLineArray.Length ; i
++
)
{
if
(mRegex.IsMatch(sLineArray[i]))
{
if
(sSaveIndex
!=
""
)
{
sSaveIndex
+=
"
"
+
i.ToString();
sSaveValue
+=
"
"
+
sLineArray[i];
}
else
{
sSaveIndex
+=
i.ToString();
sSaveValue
+=
sLineArray[i];
}
}
}
//
有返回
string
[] sTemp1;
string
[] sTemp2;
if
(sSaveIndex
!=
""
)
{
sTemp1
=
sSaveIndex.Split(
'
'
);
sTemp2
=
sSaveValue.Split(
'
'
);
if
(sTemp1.Length
!=
0
)
{
nFindIndex
=
new
int
[sTemp1.Length];
nFindValue
=
new
string
[sTemp1.Length];
for
(
int
i
=
0
;i
<
sTemp1.Length;i
++
)
{
nFindIndex[i]
=
Convert.ToInt16(sTemp1[i]);
nFindValue[i]
=
sTemp2[i];
}
location.nFindIndex
=
nFindIndex;
location.nFindeValue
=
nFindValue;
}
}
else
{
nFindIndex
=
null
;
nFindValue
=
null
;
}
}
}
//
汉字转换成网页格式
public
string
GetCurURL(
int
nIndex)
{
string
sURL;
if
(m_URLright
==
null
)
sURL
=
m_URLleft;
else
{
int
nPage
=
m_nBase
+
(nIndex
-
1
)
*
m_nStep;
sURL
=
string
.Format(m_URLleft
+
"
{0}
"
+
m_URLright, nPage.ToString());
}
//
注意:URL中的汉字要进行GB2312编码,否则会出现错误
Regex myRegex
=
new
Regex(
"
[\u4e00-\u9fa5]
"
);
MatchCollection myMatchObject
=
myRegex.Matches(sURL);
foreach
(Match sMatch
in
myMatchObject)
{
string
sGBchar
=
sMatch.ToString();
string
sUnicode
=
System.Web.HttpUtility.UrlEncode(sGBchar, System.Text.Encoding.GetEncoding(
"
GB2312
"
));
sURL
=
sURL.Replace(sGBchar, sUnicode);
}
return
sURL;
}
//
从网页中得到链接数组
public
string
[] GetURLFromFile(
string
sPath,
long
FWID)
{
//
读txt文件
//
string sPath = Environment.CurrentDirectory+"\temp\"+sFileName;
StreamReader sReader;
sReader
=
File.OpenText(sPath);
string
sLinkSecond
=
""
;
string
strLine
=
""
;
//
所有链接正则式
//
Regex myRegex = new Regex( "http:
//
([w-]+.)+[w-]+(/[w- ./?%&=]*)?");
//
"<a[^>]+href=\s*(?:'(?<href>[^'']+)'|''(?<href>[^'']+)''|(?<href>[^>\s]+))\s*[^>]*>");
Regex[] myRex
=
new
Regex[m_searchTree.Length];
int
nIndex
=
0
;
for
(
int
i
=
0
; i
<
m_searchTree.Length; i
++
)
{
if
(m_searchTree[i].lFWID
==
FWID)
{
Globel.NodeData nData
=
(Globel.NodeData)m_searchTree[i].Tag;
//
找到2级网页地址
myRex[nIndex]
=
new
Regex(nData.sRegex);
nIndex
++
;
}
}
string
[] sLinkArray
=
null
;
bool
bRepeated;
while
(sReader.Peek()
!=
-
1
)
{
//
读取一行源代码
strLine
=
sReader.ReadLine();
if
(strLine
==
null
)
{
break
;
}
else
{
strLine
=
strLine.Trim();
//
非空
if
(strLine
!=
""
)
{
for
(
int
i
=
0
; myRex[i]
!=
null
; i
++
)
{
MatchCollection myMatchObject
=
myRex[i].Matches(strLine);
foreach
(Match sMatch
in
myMatchObject)
{
string
sTempLink
=
sMatch.ToString();
//
过滤重复链接
if
(sLinkArray
!=
null
)
{
bRepeated
=
false
;
for
(
int
j
=
0
; j
<
sLinkArray.Length; j
++
)
{
if
(sTempLink
==
sLinkArray[j])
{
bRepeated
=
true
;
break
;
}
}
if
(bRepeated)
continue
;
}
if
(sLinkSecond
==
""
)
sLinkSecond
+=
sTempLink;
else
sLinkSecond
+=
"
"
+
sTempLink;
sLinkArray
=
sLinkSecond.Split(
'
'
);
}
}
}
}
}
sReader.Close();
return
sLinkArray;
}
//
保存网页-方式1:WebClient
public
bool
SaveWebPage1(
string
sURL,
string
sPath)
{
try
{
WebClient wc
=
new
WebClient();
//
下载方式1
wc.DownloadFile(sURL, sPath);
/*
下载方式2
byte[] data = wc.DownloadData(sURL);
string HtmlCode = Encoding.UTF8.GetString(data,0,data.Length);
wc.Dispose();
m_sHtmlCode = HtmlCode;
*/
}
catch
(Exception ex)
{
return
false
;
}
return
true
;
}
//
方式2:WebRequest
public
bool
SaveWebPage2(
string
sURL)
{
HttpWebRequest request
=
(HttpWebRequest)WebRequest.Create(sURL);
HttpWebResponse response
=
(HttpWebResponse)request.GetResponse();
Stream stream
=
response.GetResponseStream();
string
buffer
=
""
, line;
StreamReader reader
=
new
StreamReader(stream);
while
((line
=
reader.ReadLine())
!=
null
)
{
buffer
+=
line
+
"
"
;
}
SaveTextFile(buffer);
return
true
;
}
//
保存文本文件
public
void
SaveTextFile(
string
buffer)
{
string
filename
=
"
temp.html
"
;
StreamWriter outStream
=
new
StreamWriter(filename);
outStream.Write(buffer);
outStream.Close();
}
常用正则表达式:
匹配中文字符的正则表达式: [\u4e00-\u9fa5]
匹配双字节字符(包括汉字在内):[^\x00-\xff]
应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;}
匹配空行的正则表达式:\n[\s| ]*\r
匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/
匹配首尾空格的正则表达式:(^\s*)|(\s*$)
应用:javascript中没有像vbscript那样的trim函数,我们就可以利用这个表达式来实现,如下:
应用:javascript中没有像vbscript那样的trim函数,我们就可以利用这个表达式来实现,如下:
String.prototype.trim = function()
{
return this.replace(/(^\s*)|(\s*$)/g, "");
}
利用正则表达式分解和转换IP地址:
下面是利用正则表达式匹配IP地址,并将IP地址转换成对应数值的javascript程序:
function IP2V(ip)
{
re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //匹配IP地址的正则表达式
if(re.test(ip))
{
return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1
}
else
{
throw new Error("Not a valid IP address!")
}
}
不过上面的程序如果不用正则表达式,而直接用split函数来分解可能更简单,程序如下:
var ip="10.100.20.168"
ip=ip.split(".")
alert("IP值是:"+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))
匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
匹配网址URL的正则表达式:http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?
补充:
^\d+$ //匹配非负整数(正整数 + 0)
^[0-9]*[1-9][0-9]*$ //匹配正整数
^((-\d+)|(0+))$ //匹配非正整数(负整数 + 0)
^-[0-9]*[1-9][0-9]*$ //匹配负整数
^-?\d+$ //匹配整数
^\d+(\.\d+)?$ //匹配非负浮点数(正浮点数 + 0)
^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$ //匹配正浮点数
^((-\d+(\.\d+)?)|(0+(\.0+)?))$ //匹配非正浮点数(负浮点数 + 0)
^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$ //匹配负浮点数
^(-?\d+)(\.\d+)?$ //匹配浮点数
^[A-Za-z]+$ //匹配由26个英文字母组成的字符串
^[A-Z]+$ //匹配由26个英文字母的大写组成的字符串
^[a-z]+$ //匹配由26个英文字母的小写组成的字符串
^[A-Za-z0-9]+$ //匹配由数字和26个英文字母组成的字符串
^\w+$ //匹配由数字、26个英文字母或者下划线组成的字符串
^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$ //匹配email地址
^[a-zA-z]+://匹配(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$ //匹配url
链接的提取主要使用正则表达式,如下:
<a[^>]+href=\s*(?:'(?<href>[^'']+)'|""(?<href>[^""]+)""|(?<href>[^>\s]+))\s*[^>]*>
匹配网页中以htm为结尾的超链接
string ss ="<A\s+href=""(http|https|ftp|rtsp|mms):(\/\/|\\\\){1}(([A-Za-z0-9_-])+[.]){1,}(net|com|cn|org|cc|tv|[0-9]{1,3})(\S*\/)((\S)+[.]{1}(htm)))""\s+target=_blank>(.*)</A>"
正则式基础知识:
代表任意字符的正则表达式:(\w|\W)*
代表单行所有字符的正则表达式: (.*)
\s代表任何空格字符:比如一个空格或者tab
\d表示任何数字
5+任意数目个字符5
(52)+7
[a-f] 任何从'a'到'f'(小写)的单个字符
* 7*8前一个字符/子表达式可以出现0次或多次-8/778
+ 7+8前可出现1次或多次 -778
() 分组
| 8|6两个中的任何一个都匹配
[] 匹配一组中的-个-[A-C]可以匹配A,B,C
[^] 匹配的字符不在所给范围内 [^A-B]匹配A,B之外的任何
. 除换行以外的任何字符 .here匹配where there
\s 任何空格字符
\S 任何非空格字符
\d 任何数字字符
\D 任何非数字字符
\w 任何"词"字符(字母,数字或下划线)
网页标签匹配 <title>[\s\S]*?</title>