使用一般表达式要习惯的一点是,查看像这样怪异的字符序列,但这个序列的工作是很逻辑化的。转义序列\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 无 指定搜索是从右向左而不是从左向右进行的。具备此选项的正则表达式将移动到起始位置的左边而不是右边。(因此,起始位置应指定为字符串的结尾而不是开头。)为了避免构造具备无限循环的正则表达式的可能性,此选项不能在中流指定。但是,(?<) 回顾后发构造提供了可用作子表达式的类似替代物。
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




