当前位置:文档之家› C#中利用正则表达式实现字符串搜索

C#中利用正则表达式实现字符串搜索

C#中利用正则表达式实现字符串搜索
C#中利用正则表达式实现字符串搜索

C#中利用正则表达式实现字符串搜索

1、正则表达式简介

正则表达式提供了功能强大、灵活而又高效的方法来处理文本。正则表达式的全面模式匹配表示法可以快速地分析大量的文本以找到特定的字符模式;提取、编辑、替换或删除文本子字符串;或将提取的字符串添加到集合以生成报告。对于处理字符串(例如HTML 处理、日志文件分析和HTTP 标头分析)的许多应用程序而言,正则表达式是不可缺少的工具。

.NET 框架正则表达式并入了其他正则表达式实现的最常见功能,被设计为与Perl 5 正则表达式兼容,.NET 框架正则表达式还包括一些在其他实现中尚未提供的功能,.NET 框架正则表达式类是基类库的一部分,并且可以和面向公共语言运行库的任何语言或工具一起使用。

2、字符串搜索

正则表达式语言由两种基本字符类型组成:原义(正常)文本字符和元字符。正是元字符组为正则表达式提供了处理能力。当前,所有的文本编辑器都有一些搜索功能,通常可以打开一个对话框,在其中的一个文本框中键入要定位的字符串,如果还要同时进行替换操作,可以键入一个替换字符串,比如在Windows操作系统中的记事本、Office系列中的文档编辑器都有这种功能。这种搜索最简单的方式,这类问题很容易用String类的String.Replace()方法来解决,但如果需要在文档中识别某个重复的,该怎么办?编写一个例程,从一个String 类中选择重复的字是比较复杂的,此时使用语言就很适合。

一般表达式语言是一种可以编写搜索表达式的语言。在该语言中,可以把文档中要搜索的文本、转义序列和特定含义的其他字符组合在一起,例如序列\b表示一个字的开头和结尾(子的边界),如果要表示正在查找的以字符th开头的字,就可以编写一般表达式\bth(即序列字符界是-t-h)。如果要搜索所有以th结尾的字,就可以编写th\b(序列t-h-字边界)。但是,一般表达式要比这复杂得多,例如,可以在搜索操作中找到存储部分文本的工具性程序(facility)。

3、.NET 框架的正则表达式类

下面通过介绍.NET 框架的正则表达式类,熟悉一下.NET框架下的正则表达式的使用方法。

3.1 Regex 类表示只读正则表达式

Regex 类包含各种静态方法,允许在不显式实例化其他类的对象的情况下使用其他正则表达式类。以下代码示例创建了Regex 类的实例并在初始化对象时定义一个简单的正则表达式。请注意,使用了附加的反斜杠作为转义字符,它将\s 匹配字符类中的反斜杠指定为原义字符。

Regex r; // 声明一个Regex类的变量

r = new Regex("\\s2000"); // 定义表达式

3.2 Match 类表示正则表达式匹配操作的结果

以下示例使用Regex 类的Match 方法返回Match 类型的对象,以便找到输入字符串中第一个匹配。此示例使用Match 类的Match.Success 属性来指示是否已找到匹配。

Regex r = new Regex("abc"); // 定义一个Regex对象实例

Match m = r.Match("123abc456"); // 在字符串中匹配

if (m.Success)

{

Console.WriteLine("Found match at position " + m.Index); //输入匹配字符的位置

}

3.3 MatchCollection 类表示非重叠匹配的序列

该集合为只读的,并且没有公共构造函数。MatchCollection 的实例是由Regex.Matches 属性返回的。使用Regex 类的Matches 方法,通过在输入字符串中找到的所有匹配填充MatchCollection。下面代码示例演示了如何将集合复制到一个字符串数组(保留每一匹配)和一个整数数组(指示每一匹配的位置)中。

MatchCollection mc;

String[] results = new String[20];

int[] matchposition = new int[20];

Regex r = new Regex("abc"); //定义一个Regex对象实例

mc = r.Matches("123abc4abcd");

for (int i = 0; i < mc.Count; i++) //在输入字符串中找到所有匹配

{

results[i] = mc[i].Value; //将匹配的字符串添在字符串数组中

matchposition[i] = mc[i].Index; //记录匹配字符的位置

}

3.4 GroupCollection 类表示捕获的组的集合

该集合为只读的,并且没有公共构造函数。GroupCollection 的实例在Match.Groups 属性返回的集合中返回。下面的控制台应用程序查找并输出由正则表达式捕获的组的数目。

using System;

using System.Text.RegularExpressions;

public class RegexTest

{

public static void RunTest()

{

Regex r = new Regex("(a(b))c"); //定义组

Match m = r.Match("abdabc");

Console.WriteLine("Number of groups found = " + m.Groups.Count);

}

public static void Main()

{

RunTest();

}

}

该示例产生下面的输出:

Number of groups found = 3

3.5 CaptureCollection 类表示捕获的子字符串的序列

由于限定符,捕获组可以在单个匹配中捕获多个字符串。Captures属性(CaptureCollection 类的对象)是作为Match 和group 类的成员提供的,以便于对捕获的子字符串的集合的访问。例如,如果使用正则表达式((a(b))c)+(其中+ 限定符指定一个或多个匹配)从字符串"abcabcabc"中捕获匹配,则子字符串的每一匹配的Group 的CaptureCollection 将包含三个成员。

下面的程序使用正则表达式(Abc)+来查找字符串"XYZAbcAbcAbcXYZAbcAb"中的一个或多个匹配,阐释了使用Captures 属性来返回多组捕获的子字符串。

using System;

using System.Text.RegularExpressions;

public class RegexTest

{

public static void RunTest()

{

int counter;

Match m;

CaptureCollection cc;

GroupCollection gc;

Regex r = new Regex("(Abc)+"); //查找"Abc"

m = r.Match("XYZAbcAbcAbcXYZAbcAb"); //设定要查找的字符串

gc = m.Groups;

//输出查找组的数目

Console.WriteLine("Captured groups = " + gc.Count.ToString());

// Loop through each group.

for (int i=0; i < gc.Count; i++) //查找每一个组

{

cc = gc[i].Captures;

counter = cc.Count;

Console.WriteLine("Captures count = " + counter.ToString());

for (int ii = 0; ii < counter; ii++)

{

// Print capture and position.

Console.WriteLine(cc[ii] + " Starts at character " +

cc[ii].Index); //输入捕获位置

}

}

}

public static void Main() {

RunTest();

}

}

此例返回下面的输出结果:

Captured groups = 2

Captures count = 1

AbcAbcAbc Starts at character 3

Captures count = 3

Abc Starts at character 3

Abc Starts at character 6

Abc Starts at character 9

3.6 Capture 类包含来自单个子表达式捕获的结果

在Group 集合中循环,从Group 的每一成员中提取Capture 集合,并且将变量posn 和length 分别分配给找到每一字符串的初始字符串中的字符位置,以及每一字符串的长度。

Regex r;

Match m;

CaptureCollection cc;

int posn, length;

r = new Regex("(abc)*");

m = r.Match("bcabcabc");

for (int i=0; m.Groups[i].Value != ""; i++)

{

cc = m.Groups[i].Captures;

for (int j = 0; j < cc.Count; j++)

{

posn = cc[j].Index; //捕获对象位置

length = cc[j].Length; //捕获对象长度

}

}

图1:对象关系

把组合字符组合起来后,每次都会返回一个组对象,就可能并不是我们希望的结果。如果希望把组合字符作为搜索模式的一部分,就会有相当大的系统开销。对于单个的组,可以用以字符序列"?:"开头的组禁止这么做,就像URI样例那样。而对于所有的组,可以在RegEx.Matches()方法上指定RegExOptions.ExplicitCapture标志。

4、利用正则表达式实现字符串搜索

4.1 在C#中使用.NET一般表达式引擎

下面将通过一个样例的开发,执行并显示一些搜索的结果,说明一般表达式的一些特性,以及如何在C#中使用.NET一般表达式引擎。说明使用字符串时应在前面加上符号@。

String Text=@"I can not find my position in Beijing";

把这个文本称为输入字符串,为了说明一般表达式.NET类,本文先进行一次纯文本的搜索,这次搜索不带任何转义序列或一般表达式命令。假定要查找所有字符串ion,把这个搜索字符串称为模式。使用一般表达式和上面声明的变量Text,编写出下面的代码:

String Pattern = "ion";

MatchCollection Matches = Regex.Matches(Text,Pattern,RegexOptions);

foreach(Match NextMatch in Matches)

{ Console.WriteLine(NextMatch.Index); }

在这段代码中,使用了System.Text.RegularExpressions名称空间中Regex类的静态方法Match()。这个方法的参数是一些输入文本、一个模式和RegexOptions每句中的一组可选标志。Matches()返回MatchCollection,每个匹配都用一个Match对象来表示。在上面的代码中,只是在集合中迭代,使用Match类的Index属性,返回输入文本中匹配所在的索引。运行这段代码,将得到1个匹配项。

一般集合的功能主要取决于模式字符串。原因是模式字符串不仅仅包含纯文本。如前所述。还包含元字符和转义序列,元字符是给出命令的特殊字符,而转义序列的工作方式与C#的转义序列相同,它们都是以反斜杠\开头的字符,具有特殊的含义。例如,假定要查找以n开头的字,就可以使用转义序列\b,它表示一个字的边界(字的边界是以某个字母数字标的字符开头,或者后面是一个空白字符或标点符号),下面编写如下代码:

String Pattern = @"\bn";

MatchCollection Matches = Regex.Matches(Text,Pattern,RegexOptions.IgnoreCase|

RegexOptions.ExplicitCapture);

要在运行时把\b传递给.NET一般表达式引擎,反斜杠\不应被C#编译器解释为转

义序列。如果要查找以序列ion结尾的字,可以使用下面的代码:

String Pattern = @"ion\b";

如果要查找以字母n开头,以序列ion结尾的所有字,需要一个以\bn开头,以ion\b 结尾的模式,中间内容怎么办?需要告诉计算机n和ion中间的内容可以是任意长度的字符,只要字符不是空白即可,正确的模式如下所示:

String Pattern = @"\bn\S*ion\b";

4.2 特定字符或转义序列

大多数重要的正则表达式语言运算符都是非转义的单个字符。转义符\(单个反斜杠)通知正则表达式分析器反斜杠后面的字符不是运算符。例如,分析器将星号(*) 视为重复限定符,而将后跟星号的反斜杠(\*) 视为Unicode 字符002A。

使用一般表达式要习惯的一点是,查看像这样怪异的字符序列,但这个序列的工作是非常逻辑化的。转义序列\S表示任何不适空白的字符。*称为数量词,其含义是前面的字符可以重复任意次,包括0次。序列\S*表示任何不适空白的字符。因此,上面的模式匹配于以n开头,以ion结尾的任何单个字。下表中列出的字符转义在正则表达式和替换模式中都会被识别。

表1:特定字符或转义序列

特定字符或转义序列含义样例匹配的样例

^ 输入文本的开头^B B,但只能是文本中的第一个字符

$ 输入文本的结尾X$ X,但只能是文本中的最后一个字符

. 除了换行字符(\n)以外的所有单个字符 i.ation isation、ization

* 可以重复0次或多次的前导字符ra*t rat、raat等

+ 可以重复1次或多次的前导字符ra+t rt、rat、raat等

?可以重复0次或1次的前导字符ra?t 只有rt和rat匹配

\s 任何空白字符\sa [space]a,\ta,\na(\t和\n与C#的\t和\n含义相同)

\S 任何不是空白的字符\SF aF,rF,cF,但不能是\tf

\b 字边界ion\b 以ion结尾的任何字

\B 不是字边界的位置\BX\B 字中间的任何X

如果要搜索一个元字符,也可以通过带有反斜杠的转义字符来表示。例如,.表示除了换行字符以外的任何字符,而\.表示一个点。

可以把可替换的字符放在方括号中,请求匹配包含这些字符。例如,[1|c]表示字符可以是1或者是c。如果要搜索map或者man,可以使用序列"ma[n|p]"(仅指引号内字符,下面雷同)。在方括号中,也可以制定一个范围,例如"[a-z]"表示所有的小写字母(使用连字号(-) 允许指定连续字符范围),"[B-F]"表示B到F之间的所有大写字母,"[0-9]"表示一个数字,如果要搜索一个整数(该序列只包含0到9的字符),就可以编写"[0-9]+"(注意,使用+字符表示至少要有这样一个数字,但可以有多个数字,所以9、83和3443等都是匹配的。)

下面看看一般表达式的结果,编写一个实例RegularExpressionsZzy。建立几个一般表达式,显示其结果,让用户了解一下表达式是如何工作的。

该实例的核心是一个方法WriteMatches(),它把MatchCollection中的所有匹配以比较详细的方式显示出来。对于每个匹配,它都会显示该匹配在输入字符串中所在的索引,匹配的字符串和一个略长的字符串,其中包含输入文本中至多8个外围字符,其中至少有5个字符放在匹配的前面,至多5个字符放在匹配的后面(如果匹配的位置在输入文本的开头或结尾5个字符内,则结果中匹配前后的字符就会少于4个)。换言之,靠近输入文本末尾的匹配应是"and messaging ofd",匹配的前后各有5个字符,但位于输入文本的最后一个字上的匹配就应是"g of data",匹配的字后只有一个字符。因为在该字符的后面是字符串的结尾。这个长字符串可以更清楚地表明一般表达式是在什么地方查找到匹配的:

static void WriteMatches(string text, MatchCollection matches)

{

Console.WriteLine("Original text was: \n\n" + text + "\n");

Console.WriteLine("No. of matches: " + matches.Count);

foreach (Match nextMatch in matches)

{

int Index = nextMatch.Index;

string result = nextMatch.ToString();

int charsBefore = (Index < 5) ? Index : 5;

int fromEnd = text.Length - Index - result.Length;

int charsAfter = (fromEnd < 5) ? fromEnd : 5;

int charsToDisplay = charsBefore + charsAfter + result.Length;

Console.WriteLine("Index: {0}, \tString: {1}, \t{2}",Index, result,

text.Substring(Index - charsBefore, charsToDisplay));

}

}

在这个方法中,处理过程是确定在较长的字符串中有多少个字符可以显示,而无需超限输入文本的开头或结尾。注意在Match对象上使用了另一个属性Value,它包含标识该匹配的字符串,而且,RegularExpressionsZzy只包含名为Find_po,Find_n等的方法,这些方法根据本文执行某些搜索操作。

4.3 正则表达式选项

可以使用影响匹配行为的选项修改正则表达式模式。可以通过两种基本方法设置正则表达式选项:其一是可以在Regex(pattern, options) 构造函数中的options 参数中指定,其中options 是RegexOptions 枚举值的按位"或"组合;其二是使用内联(?imnsx-imnsx:) 分组构造或(?imnsx-imnsx) 其他构造在正则表达式模式内设置它们。

在内联选项构造中,一个选项或一组选项前面的减号(-) 用于关闭这些选项。例如,内联构造(?ix-ms) 将打开IgnoreCase 和IgnorePatternWhiteSpace 选项而关闭Multiline 和Singleline 选项。

表2:RegexOptions 枚举的成员以及等效的内联选项字符

RegexOption 成员内联字符说明

None 无指定不设置任何选项。

IgnoreCase i 指定不区分大小写的匹配。

Multiline m 指定多行模式。更改^ 和$ 的含义,以使它们分别与任何行的开头和结尾匹配,而不只是与整个字符串的开头和结尾匹配。

ExplicitCapture n 指定唯一有效的捕获是显式命名或编号的(?...) 形式的组。这允许圆括号充当非捕获组,从而避免了由(?:...) 导致的语法上的笨拙。

Compiled 无指定正则表达式将被编译为程序集。生成该正则表达式的Microsoft 中间语言(MSIL) 代码;以较长的启动时间为代价,得到更快的执行速度。

Singleline s 指定单行模式。更改句点字符(.) 的含义,以使它与每个字符(而不是除\n 外的所有字符)匹配。

IgnorePatternWhitespace x 指定从模式中排除非转义空白并启用数字符号(#) 后面的注释。请注意,空白永远不会从字符类中消除。

RightToLeft 无指定搜索是从右向左而不是从左向右进行的。具有此选项的正则表达式将移动到起始位置的左边而不是右边。(因此,起始位置应指定为字符串的结尾而不是开头。)为了避免构造具有无限循环的正则表达式的可能性,此选项不能在中流指定。但是,(?<) 回顾后发构造提供了可用作子表达式的类似替代物。

ECMAScript 无指定已为表达式启用了符合ECMAScript 的行为。此选项仅可与IgnoreCase 和Multiline 标志一起使用。将ECMAScript 同任何其他标志一起使用将导致异常。

例如,Find_po在字开头处查找以"po"开头的字符串:

static void Find_po()

{

string text = @" I can not find my position in Beijing ";

string pattern = @"\bpo\S*ion\b";

MatchCollection matches = Regex.Matches(text, pattern, RegexOptions.IgnoreCase

| RegexOptions.IgnorePatternWhitespace | RegexOptions.ExplicitCapture);

WriteMatches(text, matches);

}

这段代码还使用了名称空间RegularExpressions:

using System;

using System.Text.RegularExpressions;

4.4 匹配、组和捕获

一般表达式的一个很好的特性是可以把字符组合起来,方式与C#中的复合语句一样。在C#中,可以通过把任意数量的语句放在花括号中的方式把它们组合在一起。其结果

就像一个复合语句那样。在一般表达式模式中,也可以把任何字符组合起来(包括元字符和转义序列),像处理一个字符那样处理它们。唯一的区别是要使用圆括号,而不是花括号,得到的序列成为一个组。

例如,模式"(an)+"定位序列an的任以重复。量词+只应用于它前面的一个字符,但因为我们把字符组合起来了,所以它现在把重复的an作为一个单元来对待。"(an)."应用到输入文本"bananas came to Europe late in the annals of history"上,会从bananas中选择出anan。另一方面,如果使用an+,则将从annals中选择ann,从bananas中选择出两个an。为什么(an)+选择的是anan,而没有把单个的an作为一个匹配。匹配规则是不能重复的,如果有可能重复,在默认情况下就选择较长的匹配。

但是,组的功能要比这强大得多。在默认情况下,把模式的一部分组合为一个组时,就要求一般表达式引擎记住可以按照这个组来匹配,也可以按照整个模式来匹配。换言之,可以把组当作一个要匹配的模式,如果要把字符串分解为各个部分,这种模式就是非常有效的。

例如,URI的格式是"://

:",其中端口是可选的。它的一个样例是https://www.doczj.com/doc/aa8924234.html,:8080。假定要从一个URI中提取协议、地址和端口,而且紧邻URI的后面可能有空白(但没有标点符号),就可以使用下面的表达式:"\b(\S+)://(\S+)(?::(\S+))?\b"

该表达式的工作方式如下:首先,前导和尾部的\b序列确保只需要考虑完全是字的文本部分,在这个文本部分中,第一组"(\S+)://"会选择一个或多个不适空白的字符,其后是"://"。在HTTPURI的开头会选择出http://。花括号表示把http存储为一个组。后面的"(\S+)"则在上述URI中选择www. https://www.doczj.com/doc/aa8924234.html,,这个组在遇到词的结尾时或标记另一个组的冒号"(:)"时结束。

下一个组选择端口(本例是:8080)。后面的?表示这个组在匹配中是可选的,如果没有:xxxx,也不会妨碍匹配的标记。

这是非常重要的,因为端口在URI中一般不指定,实际上,在大多数情况下,URI 是没有端口号的。但是,事情会比较复杂。如果要求冒号可以出现,也可以不出现,但不希望把这个冒号也存储在组中。为此,可以嵌套两个组:内部的"(\S+)"组选择冒号后面的内容(本例中是8080),外面的组包含内部的组,后面是一个冒号,该冒号又在序列"?:"的后面。这个序列表示该组不应保存(只需要保存"8080",不需要保存":8080")。不要把这两个冒号混淆了,第一个冒号是序列"?:"的一部分,表示不保存这个组,第二个冒号是要搜索的文本。

在这个字符串上运行该模式:I always visit http://www. https://www.doczj.com/doc/aa8924234.html, 得到的匹配是http://www. https://www.doczj.com/doc/aa8924234.html,。在这个匹配中,仅提到了三个组,还有第四个组表示匹配本身。理论上,每个组都可以选择0次、1次或者多次匹配。单个的匹配就称为捕获。在第一个组"(\S+)",有一个捕获http。第二个组也有一个捕获www. https://www.doczj.com/doc/aa8924234.html,,但第三个组没有捕获,因为在这个URI中没有端口号。注意该字符串在其本身上包含第二个http://。虽然它匹配于第一个组,但不会被搜索出来,因为整个搜索表达式不匹配于这部分文本。

再比如下面这个例子,以下代码示例使用Match.Result 来从URL提取协议和端口号。例如,"https://www.doczj.com/doc/aa8924234.html,:8080/index.html"将返回"http:8080"。

String Extension(String url)

{

Regex r = new Regex(@"^(?\w+)://[^/]+?(?:\d+)?/",

https://www.doczj.com/doc/aa8924234.html,piled);

return r.Match(url).Result("${proto}${port}");

}

5、小结

.NET 框架正则表达式类是基类库的一部分,并且可以和面向公共语言运行库的任何语言或工具(包括https://www.doczj.com/doc/aa8924234.html, 和Visual Studio .NET)一起使用。本文给出了在C#下利用正则表达式实现字符串搜索功能的方法,通过对.NET框架下的正则表达式的研究及实例分析,总结了正则表达式的规则、选项等,方便以后朋友们的应用。

j s正则表达式

正则 正则:一个规则,它是用来处理字符串的,验证字符串是否符合某个规则(正则匹配),或者是把字符串中符合规则的内容取出来(正则捕获) 一个正则是由元字符组成的。 创建正则有两种方式(有一些区别) var reg1=/\d/;//字面量方式,代表包含0-9之间的任意一个数字即可var reg2=new RegExp("\\d");//实例创建方式 区别在于: 1.实例创建方式需要多转译一次,把具有特殊意思,并且带\的都要多转译一次。 2.字面量方式无法识别变量,而实例创建方式可以,也就是说实例创建可以进行我们的字符串拼接(把一个变量代表的值放到正则中作为规则)。 var reg1=/\d/; var reg2=new RegExp("\\d"); varreg=/zhufeng/; console.log(reg.test("welcome zhufeng student"));//true console.log(reg.test("welcome zhufeng student"));//false var c="w100"; varreg=/^"+c+"$/;//以"开头,出现一到多次,然后是c出现一到多次,最后以"结尾,而不是我们认为的字符串拼接 varreg=new RegExp("^"+c+"$");//此时只能包含w100的 正则中还包含修饰符:i(ignoreCase忽略大小写), m(multiline 匹配换行), g(global 全局匹配) varreg=/^[a-z]$/i; varreg=new RegExp("^[a-z]$","i"); console.log(reg.test("Z")); 具有特殊意义的元字符 \d :0-9之间任意一个数字 \ :转译字符 ^ :以某一个元字符开始 $ :以某一个元字符结束 \n :一个换行符 . :匹配除了\n以为的任何字符 x|y :x或者y [xyz] :x y z 三个中一个 [^xyz] :除三个中的任一个 [a-z] :a--z之间任意一个 [^a-z] :除了a--z之间任意一个

csharp正则表达式

学习笔记:正则表达式 2011-8-29 一.正则表达式 正则表达式(Regex)是用来进行文本处理的技术,是语言无关的,在几乎所有语言中都有实现。 一个正则表达式就是由普通的字符及特殊字符(称为元字符符)组成的文字模式。该模式秒杀在查找文章主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。 正则表达式的常用元字符(全为英文状态,注意可以代表的字符种类和个数): 元字符含义 .(点) 可以匹配除”\n”外的任意一个字符 [](中括号) 可以匹配中括号内的任意一个字符 例如,"[abc]" 匹配"plain"中的"a" |(或符号) 可以匹配或符号两边的任意一个字符,优先级比较低 匹配x 或y。例如"z|food" 可匹配"z" 或"food"。 正则表达式的常用限定符(全为英文状态): 元字符含义 *(星号) 其限定的表达式出现次数等于或大于0次 例如,"zo*"可以匹配"z"、"zoo" +(加号) 其限定的表达式至少出现1次 例如,"zo+"可以匹配"zoo",但不匹配"z" ?(问号) 其限定的表达式出现1次或0次 例如,"a?ve?"可以匹配"never"中的"ve" {n} 其限定的表达式出现次数确定n次(n≥0) {n,} 其限定的表达式至少出现n次 {n,m} 其限定的表达式出现的次数为≥n次,≤m次(m>n) 还有几个重要的符号: 符号含义 ^ (Shift+6)匹配输入的开始位置 非的意思。例如[^a-z],匹配非a-z的一个字符。 $ (Shift+4)匹配输入的结尾 \将下一个字符标记为特殊字符或字面值 例如:想匹配”.”时或其他特殊字符时,需写为的”\.” ()(小括号) 1.改变优先级 2.分组,提取信息 需要熟记一些简写: \d = [0-9]

正则表达式

1.验证用户名和密码:("^[a-zA-Z]\w{5,15}$")正确格式:"[A-Z][a-z]_[0-9]"组成,并且第一个字必须为字母6~16位; 2.验证电话号码:("^(\d{3,4}-)\d{7,8}$")正确格式:xxx/xxxx-xxxxxxx/xxxxxxxx; 3.验证手机号码:"^1[3|4|5|7|8][0-9]\\d{8}$"; 4.验证身份证号(15位或18位数字):"\d{14}[[0-9],0-9xX]"; 5.验证Email地址:("^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$"); 6.只能输入由数字和26个英文字母组成的字符串:("^[A-Za-z0-9]+$"); 7.整数或者小数:^[0-9]+([.][0-9]+){0,1}$ 8.只能输入数字:"^[0-9]*$"。 9.只能输入n位的数字:"^\d{n}$"。 10.只能输入至少n位的数字:"^\d{n,}$"。 11.只能输入m~n位的数字:"^\d{m,n}$"。 12.只能输入零和非零开头的数字:"^(0|[1-9][0-9]*)$"。 13.只能输入有两位小数的正实数:"^[0-9]+(\.[0-9]{2})?$"。 14.只能输入有1~3位小数的正实数:"^[0-9]+(\.[0-9]{1,3})?$"。 15.只能输入非零的正整数:"^\+?[1-9][0-9]*$"。 16.只能输入非零的负整数:"^\-[1-9][0-9]*$"。 17.只能输入长度为3的字符:"^.{3}$"。 18.只能输入由26个英文字母组成的字符串:"^[A-Za-z]+$"。 19.只能输入由26个大写英文字母组成的字符串:"^[A-Z]+$"。 20.只能输入由26个小写英文字母组成的字符串:"^[a-z]+$"。 21.验证是否含有^%&',;=?$\"等字符:"[%&',;=?$\\^]+"。 22.只能输入汉字:"^[\u4e00-\u9fa5]{0,}$"。 23.验证URL:"^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$"。 24.验证一年的12个月:"^(0?[1-9]|1[0-2])$"正确格式为:"01"~"09"和"10"~"12"。 25.验证一个月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正确格式为;"01"~"09"、"10"~"29"和“30”~“31”。 26.获取日期正则表达式:\\d{4}[年|\-|\.]\d{\1-\12}[月|\-|\.]\d{\1-\31}日? 评注:可用来匹配大多数年月日信息。 27.匹配双字节字符(包括汉字在内):[^\x00-\xff] 评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1) 28.匹配空白行的正则表达式:\n\s*\r 评注:可以用来删除空白行 29.匹配HTML标记的正则表达式:<(\S*?)[^>]*>.*?|<.*? /> 评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力 30.匹配首尾空白字符的正则表达式:^\s*|\s*$

正则表达式

正则表达式 一、什么是这则表达式 正则表达式(regular expressions)是一种描述字符串集的方法,它是以字符串集中各字符串的共有特征为依据的。正则表达式可以用于搜索、编辑或者是操作文本和数据。它超出了java程序设计语言的标准语法,因此有必要去学习特定的语法来构建正则表达式。一般使用的java.util.regex API所支持的正则表达式语法。 二、测试用具 import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Regex{ public static void main(String[]args)throws Exception{ BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); if(br==null){ System.out.println("没有输入任何数据"); System.exit(1); } while(true){ System.out.print("输入表达式:"); Pattern pattern=https://www.doczj.com/doc/aa8924234.html,pile(br.readLine()); System.out.print("输入字符串:"); Matcher matcher=pattern.matcher(br.readLine()); boolean found=false; while(matcher.find()){ System.out.println("找到子字符串"+matcher.group()+" 开始于索引"+matcher.start()+"结束于索引"+matcher.end()+"\n") found=true; } if(!found){ System.out.println("没有找到子字符串\n"); } } } }

JS正则表达式大全

JS正则表达式大全 JS正则表达式大全【1】 正则表达式中的特殊字符【留着以后查用】字符含意 \ 做为转意,即通常在"\"后面的字符不按原来意义解释,如/b/匹配字符"b",当b前面加了反斜杆后/\b/,转意为匹配一个单词的边界。 -或- 对正则表达式功能字符的还原,如"*"匹配它前面元字符0次或多次,/a*/将匹配a,aa,aaa,加了"\"后,/a\*/将只匹配"a*"。 ^ 匹配一个输入或一行的开头,/^a/匹配"an A",而不匹配"An a" $ 匹配一个输入或一行的结尾,/a$/匹配"An a",而不匹配"an A" * 匹配前面元字符0次或多次,/ba*/将匹配b,ba,baa,baaa + 匹配前面元字符1次或多次,/ba*/将匹配ba,baa,baaa ? 匹配前面元字符0次或1次,/ba*/将匹配b,ba (x) 匹配x保存x在名为$1...$9的变量中 x|y 匹配x或y {n} 精确匹配n次 {n,} 匹配n次以上 {n,m} 匹配n-m次 [xyz] 字符集(character set),匹配这个集合中的任一一个字符(或元字符) [^xyz] 不匹配这个集合中的任何一个字符 [\b] 匹配一个退格符 \b 匹配一个单词的边界 \B 匹配一个单词的非边界 \cX 这儿,X是一个控制符,/\cM/匹配Ctrl-M \d 匹配一个字数字符,/\d/ = /[0-9]/ \D 匹配一个非字数字符,/\D/ = /[^0-9]/ \n 匹配一个换行符 \r 匹配一个回车符 \s 匹配一个空白字符,包括\n,\r,\f,\t,\v等 \S 匹配一个非空白字符,等于/[^\n\f\r\t\v]/ \t 匹配一个制表符 \v 匹配一个重直制表符 \w 匹配一个可以组成单词的字符(alphanumeric,这是我的意译,含数字),包括下划线,如[\w]匹配

正则表达式

本文分十四个类别对正则表达式的意义进行了解释,这十四各类别是:字符/字符类/预定义字符类/POSIX字符类/https://www.doczj.com/doc/aa8924234.html,ng.Character类/Unicode块和类别的类/边界匹配器/Greedy数量词/Reluctant数量词/Possessive数量词/Logical运算符/Back引用/引用/特殊构造。 1.1.字符 x 字符 x。例如a表示字符a \\ 反斜线字符。在书写时要写为\\\\。(注意:因为java在第一次解析时把\\\\解析成正则表达式\\,在第二次解析时再解析为\,所以凡是不是1.1列举到的转义字符,包括1.1的\\,而又带有\的都要写两次) \0n 带有八进制值 0的字符 n (0 <= n <= 7) \0nn 带有八进制值 0的字符 nn (0 <= n <= 7) \0mnn 带有八进制值 0的字符 mnn(0 <= m <= 3、0 <= n <= 7) \xhh 带有十六进制值 0x的字符 hh \uhhhh 带有十六进制值 0x的字符 hhhh \t 制表符 ('\u0009') \n 新行(换行)符 ('\u000A') \r 回车符 ('\u000D') \f 换页符 ('\u000C') \a 报警 (bell) 符 ('\u0007') \e 转义符 ('\u001B') \cx 对应于 x 的控制符 1.2.字符类 [abc] a、b或 c(简单类)。例如[egd]表示包含有字符e、g或d。 [^abc] 任何字符,除了 a、b或 c(否定)。例如[^egd]表示不包含字符e、g或d。 [a-zA-Z] a到 z或 A到 Z,两头的字母包括在内(范围) [a-d[m-p]] a到 d或 m到 p:[a-dm-p](并集) [a-z&&[def]] d、e或 f(交集) [a-z&&[^bc]] a到 z,除了 b和 c:[ad-z](减去) [a-z&&[^m-p]] a到 z,而非 m到 p:[a-lq-z](减去) 1.3.预定义字符类(注意反斜杠要写两次,例如\d写为\\d) . 任何字符(与行结束符可能匹配也可能不匹配) \d 数字:[0-9] \D 非数字: [^0-9] \s 空白字符:[ \t\n\x0B\f\r] \S 非空白字符:[^\s] \w 单词字符:[a-zA-Z_0-9] \W 非单词字符:[^\w] 1.4.POSIX 字符类(仅 US-ASCII)(注意反斜杠要写两次,例如\p{Lower}写为\\p{Lower})

正则表达式

要想真正的用好正则表达式,正确的理解元字符是最重要的事情。下表列出了所有的元字符和对它们的一个简短的描述。 字符描述 \ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“\n”匹配字符“n”。“\\n”匹配一个换行符。序列“\\”匹配“\”而“\(”则匹配“(”。 ^ 匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“\n”或“\r”之后的位置。 $ 匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前的位置。 * 匹配前面的子表达式零次或多次。例如,zo*能匹配“z”以及“zoo”。*等价于{0,}。 + 匹配前面的子表达式一次或多次。例如,“z o+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。 ? 匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“does”或“does”中的“d o”。?等价于{0,1}。 {n} n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o。 {n,} n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“fo o o ood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。 {n,m} m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”将匹配“fooooood”中的前三个o。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。 ? 当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo”,“o?”将匹配单个“o”,而“o+”将匹配所有“o”。 点匹配除“\n”之外的任何单个字符。要匹配包括“\n”在内的任何字符,请使用像“[\s\S]”的模式。

正则表达式语法完整版

正则表达式基础知识 一个正则表达式就是由普通字符(例如字符a 到z)以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。如:

下面看几个例子: "^The":表示所有以"The"开始的字符串("There","The cat"等); "of despair$":表示所以以"of despair"结尾的字符串; "^abc$":表示开始和结尾都是"abc"的字符串——呵呵,只有"abc"自己了;"notice":表示任何包含"notice"的字符串。 '*','+'和'?'这三个符号,表示一个或一序列字符重复出现的次数。它们分别表示“没有或更多”,“一次或更多”还有“没有或一次”。下面是几个例子: "ab*":表示一个字符串有一个a后面跟着零个或若干个b。("a", "ab", "abbb",……);"ab+":表示一个字符串有一个a后面跟着至少一个b或者更多; "ab?":表示一个字符串有一个a后面跟着零个或者一个b; "a?b+$":表示在字符串的末尾有零个或一个a跟着一个或几个b。 也可以使用范围,用大括号括起,用以表示重复次数的范围。 "ab{2}":表示一个字符串有一个a跟着2个b("abb"); "ab{2,}":表示一个字符串有一个a跟着至少2个b; "ab{3,5}":表示一个字符串有一个a跟着3到5个b。

请注意,你必须指定范围的下限(如:"{0,2}"而不是"{,2}")。 还有,你可能注意到了,'*','+'和'?'相当于"{0,}","{1,}"和"{0,1}"。 还有一个'|',表示“或”操作: "hi|hello":表示一个字符串里有"hi"或者"hello"; "(b|cd)ef":表示"bef"或"cdef"; "(a|b)*c":表示一串"a""b"混合的字符串后面跟一个"c"; '.'可以替代任何字符: "a.[0-9]":表示一个字符串有一个"a"后面跟着一个任意字符和一个数字; "^.{3}$":表示有任意三个字符的字符串(长度为3个字符); 方括号表示某些字符允许在一个字符串中的某一特定位置出现: "[ab]":表示一个字符串有一个"a"或"b"(相当于"a|b"); "[a-d]":表示一个字符串包含小写的'a'到'd'中的一个(相当于"a|b|c|d"或者"[abcd]");"^[a-zA-Z]":表示一个以字母开头的字符串; "[0-9]%":表示一个百分号前有一位的数字; "[0-9]+":表示一个以上的数字; ",[a-zA-Z0-9]$":表示一个字符串以一个逗号后面跟着一个字母或数字结束。 你也可以在方括号里用'^'表示不希望出现的字符,'^'应在方括号里的第一位。(如:"%[^a-zA-Z]%"表 示两个百分号中不应该出现字母)。 为了逐字表达,必须在"^.$()|*+?{\"这些字符前加上转移字符'\'。 请注意在方括号中,不需要转义字符。

正则表达式

[23:39:35] 王尧说:"^\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 /^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/ //年-月-日 /^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/ //月/日/年 ^(\w+((-\w+)|(\.\w+))*)\+\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$ //Emil "(d+-)?(d{4}-?d{7}|d{3}-?d{8}|^d{7,8})(-d+)?" //电话号码 "^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1, 2}|1dd|2[0-4]d|25[0-5])$" //IP地址 匹配中文字符的正则表达式:[\u4e00-\u9fa5] 匹配双字节字符(包括汉字在内):[^\x00-\xff] 匹配空行的正则表达式:\n[\s| ]*\r 匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/ 匹配首尾空格的正则表达式:(^\s*)|(\s*$) 匹配Email地址的正则表达式:^(\w+((-\w+)|(\.\w+))*)\+\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$ 匹配网址URL的正则表达式:^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$ 匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 匹配国内电话号码:(\d{3}-|\d{4}-)?(\d{8}|\d{7})? 匹配腾讯QQ号:^[1-9]*[1-9][0-9]*$ 漢字 Private Ps_KanjiRegex As String = "\u00A0-\u303F\u3200-\u33CF\u4E00-\uFF60\uFFA0-\uFFE5" ''入力可能漢字のコード(正規表現チェック用)

正则表达式

第一章正则表达式概述 正则表达式(Regular Expression)起源于人类神经系统的研究。正则表达式的定义有以下几种: ●用某种模式去匹配一类字符串的公式,它主要是用来描述字符串匹配的工具。 ●描述了一种字符串匹配的模式。可以用来检查字符串是否含有某种子串、将匹配的子 串做替换或者从中取出符合某个条件的子串等。 ●由普通字符(a-z)以及特殊字符(元字符)组成的文字模式,正则表达式作为一个模版, 将某个字符模式与所搜索的字符串进行匹配。 ●用于描述某些规则的的工具。这些规则经常用于处理字符串中的查找或替换字符串。 也就是说正则表达式就是记录文本规则的代码。 ●用一个字符串来描述一个特征,然后去验证另一个字符串是否符合这个特征。 以上这些定义其实也就是正则表达式的作用。 第二章正则表达式基础理论 这些理论将为编写正则表达式提供法则和规范,正则表达式主要包括以下基础理论: ●元字符 ●字符串 ●字符转义 ●反义 ●限定符 ●替换 ●分组 ●反向引用 ●零宽度断言 ●匹配选项 ●注释 ●优先级顺序 ●递归匹配 2.1 元字符 在正则表达式中,元字符(Metacharacter)是一类非常特殊的字符,它能够匹配一个位置或字符集合中的一个字符,如:、 \w等。根据功能,元字符可以分为两种类型:匹配位置的元字符和匹配字符的元字符。 2.1.1 匹配位置的元字符

包括:^、$、和\b。其中^(脱字符号)和$(美元符号)都匹配一个位置,分别匹配行的开始和结尾。比如,^string匹配以string开头的行,string$匹配以string结尾的行。^string$匹配以string开始和结尾的行。单个$匹配一个空行。单个^匹配任意行。\b匹配单词的开始和结尾,如:\bstr匹配以str开始的单词,但\b不匹配空格、标点符号或换行符号,所以,\bstr可以匹配string、string fomat等单词。\bstr正则表达式匹配的字符串必须以str开头,并且str以前是单词的分界处,但此正则表达式不能限定str之后的字符串形式。以下正则表达式匹配以ing结尾的字符串,如string、This is a string等 Ing\b 正则表达式ing\b匹配的字符串必须以ing结尾,并且ing后是分界符,以下正则表达式匹 配一个完整的单词:\bstring\b。 2.1.2匹配字符的元字符 匹配字符的元字符有7个:.(点号)、\w、\W、、s\、\S、\d和\D。其中点号匹配除换行之外的任意字符;\w匹配单词字符(包括字母、汉字、下划线和数字);\W匹配任意非单词字符、\s匹配任意的空白字符,如空格、制表符、换行等;\S匹配任意的非空白字符;\d匹配任意数字字符;\D匹配任意的非数字字符。如: ^.$匹配一个非空行,在该行中可以包含除了换行符以外的任意字符。 ^\w$匹配一个非空行,并且该行中只能包含字母、数字、下划线和汉字中的任意字符。 \ba\w\w\w\w\w\w\\b匹配以字母a开头长度等于7的任意单词 \ba\w\w\w\d\d\d\D\b匹配以字母a开头后面有3个字符三个数字和1个非数字字符长度等于8的单词 2.2字符类 字符类是一个字符集合,如果该字符集合中的任何一个字符被匹配,则它会找到该匹配项。字符类可以在[](方括号)中定义。如:

正则表达式和字符

一、正则表达式 除非您以前使用过正则表达式,否则您可能不熟悉此术语。但是,毫无疑问,您已经使用过不涉及脚本的某些正则表达式概念。 正则表达式示例 例如,您很可能使用? 和* 通配符来查找硬盘上的文件。通配符匹配文件名中的单个字符,而* 通配符匹配零个或多个字符。像data?.dat 这样的模式将查找下列文件: data1.dat data2.dat datax.dat dataN.dat 使用* 字符代替? 字符扩大了找到的文件的数量。data*.dat 匹配下列所有文件: data.dat data1.dat data2.dat data12.dat datax.dat dataXYZ.dat 尽管这种搜索方法很有用,但它还是有限的。和* 通配符的能力引入了正则表达式所依赖的概念,但正则表达式功能更强大,而且更加灵活。

二、正则表达式语法 正则表达式是一种文本模式,包括普通字符(例如,a 到z 之间的字母)和特殊字符(称为“元字符”)。模式描述在搜索文本时要匹配的一个或多个字符串。 正则表达式示例 下表包含了元字符的完整列表以及它们在正则表达式上下文中的行为:

三、生成正则表达式 正则表达式的结构与算术表达式的结构类似。即,各种元字符和运算符可以将小的表达式组合起来,创建大的表达式。 分隔符 通过在一对分隔符之间放置表达式模式的各种组件,就可以构建正则表达式。对于JScript,分隔符是正斜杠(/) 字符。例如: /expression/ 在上面的示例中,正则表达式模式(expression) 存储在RegExp对象的Pattern属性中。正则表达式的组件可以是单个字符、字符集、字符的范围、在几个字符之间选择或者所有这些组件的任何组合。 四、优先级顺序 正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似。 运算符 下表从最高到最低说明了各种正则表达式运算符的优先级顺序:

正则表达式快速记忆法

要想学会正则表达式,理解元字符是一个必须攻克的难关。 不用刻意记 .:匹配任何单个字符。 例如正则表达式“b.g”能匹配如下字符串:“big”、“bug”、“bg”,但是不匹配“buug”,“b..g”可以匹配“buug”。 [ ] :匹配括号中的任何一个字符。 例如正则表达式“b[aui]g”匹配bug、big和bag,但是不匹配beg、baug。可以在括号中使用连字符“-”来指定字符的区间来简化表示,例如正则表达式[0-9]可以匹配任何数字字符,这样正则表达式“a[0-9]c”等价于“a[0123456789]c”就可以匹配“a0c”、“a1c”、“a2c”等字符串;还可以制定多个区间,例如“[A-Za-z]”可以匹配任何大小写字母,“[A-Za-z0-9]”可以匹配任何的大小写字母或者数字。 ( ) :将()之间括起来的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域,这个元字符在字符串提取的时候非常有用。把一些字符表示为一个整体。改变优先级、定义提取组两个作用。 | :将两个匹配条件进行逻辑“或”运算。 'z|food'能匹配"z"或"food"。'(z|f)ood'则匹配"zood"或"food"。 *:匹配0至多个在它之前的子表达式,和通配符*没关系。 例如正则表达式“zo*”能匹配“z”、“zo”以及“zoo”;因此“.*”意味着能够匹配任意字符串。"z(b|c)*"→zb、zbc、zcb、zccc、zbbbccc。"z(ab)*"能匹配z、zab、zabab(用括号改变优先级)。 + :匹配前面的子表达式一次或多次,和*对比(0到多次)。 例如正则表达式9+匹配9、99、999等。“zo+”能匹配“zo”以及“zoo”,不能匹配"z"。 ? :匹配前面的子表达式零次或一次。 例如,"do(es)?"可以匹配"do"或"does"。一般用来匹配“可选部分”。 {n} :匹配确定的n次。 "zo{2}"→zoo。例如,“e{2}”不能匹配“bed”中的“e”,但是能匹配“seed”中的两个“e”。 {n,} :至少匹配n次。 例如,“e{2,}”不能匹配“bed”中的“e”,但能匹配“seeeeeeeed”中的所有“e”。 {n,m}:最少匹配n次且最多匹配m次。 “e{1,3}”将匹配“seeeeeeeed”中的前三个“e” ^(shift+6):匹配一行的开始。 例如正则表达式“^regex”能够匹配字符串“regex我会用”的开始,但是不能匹配“我会用regex”。 ^另外一种意思:非!(暂时不用理解) $ :匹配行结束符。 例如正则表达式“浮云$”能够匹配字符串“一切都是浮云”的末尾,但是不能匹配字符串“浮云呀”

正则表达式元字符和元符号

正则表达式中的元字符和元符号 元字符和元符号 字符类:单个字符和数字 元字符/元符号匹配情况 . 匹配除换行符外的任意字符 [a-z0-9] 匹配括号中的字符集中的任意字符 [^a-z0-9] 匹配任意不在括号中的字符集中的字符 \d 匹配数字 \D 匹配非数字,同[^0-9]相同 \w 匹配字母 \W 匹配非字母 字符类:空白字符 \0 匹配null字符 \b 匹配空格字符 \f 匹配进纸字符 \n 匹配换行符 \r 匹配回车字符 \s 匹配空白字符、空格、制表符或换行符 \S 匹配非空白字符 \t 匹配制表符

字符类:锚字符 ^ 首行匹配 $ 行尾匹配 \A 只匹配字符串开始处 \b 匹配单词边界,词在[ ]内时无效\B 匹配非单词边界 \G 匹配当前搜索的开始位置 \Z 匹配字符串结束处或行尾 \z 只匹配字符串结束处 字符类:重复字符 x? 匹配0个或1个x x* 匹配0个或任意多个x x+ 匹配至少一个x (xyz)+ 匹配至少一个xyz模式 x{m,n} 匹配最少m个、最多n个x 字符类:替代字符 was|were|will 匹配was或were或will 字符类:记录字符 (string) 用于反向引用 \1或$1 匹配第一对括号中的内容 \2或$2 匹配第二对括号中的内容 \3或$3 匹配第三对括号中的内容

JavaScript1.5中新加入的字符 (?:x) 匹配x但不记录匹配结果。这被称为非捕获括号。x(?=y) 当x后接y时匹配x。 x(?!y) 当x后不是y时匹配x。 单字符和一位元字符 元字符匹配情况 匹配除换行以外的任意字符 [a-z0-9_] 匹配字符集中的任意字符 [^a-z0-9_] 匹配不在字符集中的任意字符 元符号 元符号匹配内容对应字符 \d 数字[0-9] \D 非数字[^0-9] \s 非白字符(制表符、空格、换行符、回车、 换页符、垂直制表符) \S 非空白字符 \w 单词字符[A-Za-z0-9_] \W 非单词字符[^A-Za-z0-9_]

正则表达式

正则表达式说明 符号. 说明:匹配任何单个字符。例如正则表达式r.t匹配这些字符串:rat、rut、r t,但是不匹配root。除换行符号外的任意字符 符号$ 说明:匹配行结束符。例如正则表达式weasel$ 能够匹配字符串"He's a weasel"的末尾,但是不能匹配字符串"They are a bunch of weasels."。 单独使用表示字符串的结束。 符号^ 说明:匹配一行的开始。例如正则表达式^When in能够匹配字符串"When in the course of human events"的开始,但是不能匹配"What and When in the"。单独使用表示字符串的开始。 符号* 说明:匹配0或多个正好在它之前的那个字符。例如正则表达式.*意味着能够匹配任意数量的任何字符。 符号\ 说明:这是引用符,用来将这里列出的这些元字符当作普通的字符来进行匹配。例如正则表达式\$被用来匹配美元符号,而不是行尾,类似的,正则表达式\.用来匹配点字符,而不是任何字符的通配符。 符号[ ] [c1-c2] [^c1-c2] 说明:匹配括号中的任何一个字符。例如正则表达式r[aou]t匹配rat、rot 和rut,但是不匹配ret。可以在括号中使用连字符-来指定字符的区间,例如正则表达式[0-9]可以匹配任何数字字符;还可以制定多个区间,例如正则表达式[A-Za-z]可以匹配任何大小写字母。另一个重要的用法是“排除”,要想匹配除了指定区间之外的字符——也就是所谓的补集——在左边的括号和第一个字符之间使用^字符,例如正则表达式[^269A-Z] 将匹配除了2、6、9和所有大写字母之外的任何字符。 符号< > 说明:匹配词(word)的开始(<)和结束(>)。例如正则表达式\

常用正则表达式字符及其含义

1. [……] : 匹配括号中的任何一个字符. [^……] : 匹配不在括号中的任何一个字符. \w : 匹配任何一个字符(a~z , A~Z , 0~9). \W : 匹配任何一个空白字符. \s : 匹配任何一个非空白字符. \S : 与任何非单词字符匹配. \d : 匹配任何一个数字. \D : 匹配任何一个非数字. [\b] : 匹配一个退格键字母. {n,m} : 最少匹配前面表达式n次,最大为m次. {n,} : 最少匹配前面表达式n次. {n} : 恰好匹配前面表达式为n次. ? : 匹配前面表达式0或1 次{0,1} + : 至少匹配前面表达式1 次{1,} * : 至少匹配前面表达式0次{0,} | : 匹配前面表达式或后面表达式. (…) : 在单元中组合项目. ^ : 匹配字符串的开头. $ : 匹配字符串的结尾. \b : 匹配字符边界. \B : 匹配非字符边界的某个位置.

2.举几个常用的正则表达式: (1)验证电子邮件. \w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* 或 \S+@\S+\ .\S+ (2) 验证网址: HTTP://\S+\ .\S+ : 验证网址为大写字母 . http://\S+\ . \S + : 验证网址为小写字母. (3) 验证邮政编码: \d{6} (4) 其他 [0-9] : 表示0~9 十个数字. \d* : 表示任意个数字. \d{3,4}-\d{7,8} : 表示中国大陆的固定电话号码. \d{2}-\d{5} : 验证由两位数字. 一个连字符再加5位数字组成的ID号. <\s*(\S+)(\s[^>]*)?>[\s\S]*<\s*\/\1\s*> : 匹配HTML标记.

正则表达式语法及常用规则

正则表达式语法 正则表达式是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”)。模式描述在搜索文本时要匹配的一个或多个字符串。 正则表达式示例

常用正则表达式: 整数或者小数:^[0-9]+\.{0,1}[0-9]{0,2}$只能输入数字:"^[0-9]*$"。 只能输入n位的数字:"^\d{n}$"。 只能输入至少n位的数字:"^\d{n,}$"。 只能输入m~n位的数字:。"^\d{m,n}$"

只能输入零和非零开头的数字:"^(0|[1-9][0-9]*)$"。 只能输入有两位小数的正实数:"^[0-9]+(.[0-9]{2})?$"。 只能输入有1~3位小数的正实数:"^[0-9]+(.[0-9]{1,3})?$"。 只能输入非零的正整数:"^\+?[1-9][0-9]*$"。 只能输入非零的负整数:"^\-[1-9][]0-9"*$。 只能输入长度为3的字符:"^.{3}$"。 只能输入由26个英文字母组成的字符串:"^[A-Za-z]+$"。 只能输入由26个大写英文字母组成的字符串:"^[A-Z]+$"。 只能输入由26个小写英文字母组成的字符串:"^[a-z]+$"。 只能输入由数字和26个英文字母组成的字符串:"^[A-Za-z0-9]+$"。 只能输入由数字、26个英文字母或者下划线组成的字符串:"^\w+$"。 验证用户密码:"^[a-zA-Z]\w{5,17}$"正确格式为:以字母开头,长度在6~18之间,只能包含字符、数字和下划线。 验证是否含有^%&',;=?$\"等字符:"[^%&',;=?$\x22]+"。 只能输入汉字:"^[\u4e00-\u9fa5]{0,}$" 验证Email地址:"^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([- .]\w+)*$"。 验证InternetURL:"^http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?$"。 验证电话号码:"^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$"正确格式为:"XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX"。 验证11位的手机号:/^1[3|5][0-9]\d{4,8}$/ 验证身份证号(15位或18位数字):"^\d{15}|\d{18}$"。 验证一年的12个月:"^(0?[1-9]|1[0-2])$"正确格式为:"01"~"09"和"1"~"12"。 验证一个月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正确格式为;"01"~"09"和"1"~"31"。匹配中文字符的正则表达式: [\u4e00-\u9fa5]

正则表达式元字符和元符号

正则表达式中的元字符和元符号 元字符/元符号匹配情况 .匹配除换行符外的 任意字符 [a-z0-9]匹配括号中的字符 集中的任意字符 [^a-z0-9]匹配任意不在括号 中的字符集中的字 符 \d匹配数字 \D匹配非数字,同[^0- 9]相同 \w匹配字母 \W匹配非字母

\0匹配null字符 \b匹配空格字符 \f匹配进纸字符 \n匹配换行符 \r匹配回车字符 \s匹配空白字符、空 格、制表符或换行 符 \S匹配非空白字符\t匹配制表符 ^首行匹配 $行尾匹配 \A只匹配字符串开始

处 \b匹配单词边界,词 在[ ]内时无效 \B匹配非单词边界 \G匹配当前搜索的开 始位置 \Z匹配字符串结束处 或行尾 \z只匹配字符串结束 处 x?匹配0个或1个x x*匹配0个或任意多 个x x+匹配至少一个x (xyz+匹配至少一个xyz 模式

x{m,n}匹配最少m个、最 多n个x was|were|will匹配was或were或 will (string用于反向引用 \1或$1匹配第一对括号中 的内容 \2或$2匹配第二对括号中 的内容 \3或$3匹配第三对括号中 的内容 (?:x匹配x但不记录匹 配结果。这被称为 非捕获括号。 x(?=y当x后接y时匹配

x。 x(?!y当x后不是y时匹 配x。 匹配除换行以外的 任意字符 [a-z0-9_]匹配字符集中的任 意字符 [^a-z0-9_]匹配不在字符集中 的任意字符 \d数字[0-9] \D非数字[^0-9] \s非白字符(制表符、空

格、换行符、回车、换 页符、垂直制表符) \S非空白字符 \w单词字符[A-Za-z0- 9_] \W非单词字符[^A-Za-z0- 9_]

正则表达式

正则表达式 个数 c{n} {1}表示一个的意思。 /c{1}/只能匹配一个c。 /c{2}/则会匹配两个连续的c。 以此类推, /c{n}/则会匹配n个连续的c。 c{m,n} c{3,4}的意思是,连续的3个c或者4个c。 c{n,} c{1,}表示1个以上的c。 *,+,? *表示0次或者多次,等同于{0,},即 c* 和 c{0,} 是一个意思。 +表示一次或者多次,等同于{1,},即 c+ 和 c{1,} 是一个意思。 最后,?表示0次或者1次,等同于{0,1},即 c? 和 c{0,1} 是一个意思。

如果我们希望正则尽量少地匹配字符,那么就可以在表示数字的符号后面加上一个?。组成如下的形式: {n,}?, *?, +?, ??, {m,n}? 格式 /^开头,结尾$/ ^表示只匹配字符串的开头 点’.’ ‘.’会匹配字符串中除了换行符\n之外的所有字符 二选一,正则表达式中的或,“|“ b|c表示,匹配b或者c。 字符集合[abc] [abc]表示a或者b或者c中的任意一个字符 我们在字字符集合中使用如下的表示方式:[a-z],[A-Z],[0-9],分别表示小写字母,大写字母,数字。 反字符集合[^abc] ^在正则表达式开始部分的时候表示开头的意思,例如/^c/表示开头是c;但是在字符集和中,它表示的是类似“非“的意思,例如[^abc]就表示不能是a,b或者c中的任何一个。 边界与非边界 \b、\B \b表示的边界的意思,也就是说,只有字符串的开头和结尾才算数 与\b对应\B表示非边界

数字与非数字 \d、\D \d表示数字的意思,相反,\D表示非数字 空白 \f、 \n、\r、\t、\v、\s和\S \f匹配换页符,\n匹配换行符,\r匹配回车,\t匹配制表符,\v匹配垂直制表符。 \s匹配单个空格,等同于[\f\n\r\t\v] 同样,\S表示非空格字符。 单词字符 \w、\W \w表示单词字符,等同于字符集合[a-zA-Z0-9_]。 \W表示非单词字符,等效于[^a-zA-Z0-9_] 反向引用 \1、\2 、…. 形式如下:/(子正则表达式)\1/ 不记录子正则表达式的匹配结果 (?:pattern) 正向预查 (?=pattern)、(?!pattern) 形式:(?=pattern) 所谓正向预查,意思就是:要匹配的字符串,后面必须紧跟着pattern! 正则表达式的修饰符 全局匹配,修饰符g 形式:/pattern/g 不区分大小写,修饰符i 形式:/pattern/i

相关主题
文本预览
相关文档 最新文档