导航:首页 > 源码编译 > 正则表达式匹配算法

正则表达式匹配算法

发布时间:2022-07-04 09:03:35

❶ 正则表达式是什么

正则表达式(英文:Regular Expression),在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索和/或替换那些符合某个模式的文本内容。许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。“正则表达式”通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen。
基本概念 一个正则表达式通常被称为一个模式 (pattern),为用来描述或者匹配一系列符合某个句法规则的字符串。例如:Handel、H�0�1ndel 和 Haendel 这三个字符串,都可以由 "H(a|�0�1|ae)ndel" 这个模式来描述。大部分正则表达式的形式都有如下的结构:替换 | 竖直分隔符代表替换。例如"gray|grey"可以匹配grey或gray。</dd>数量限定 某个字符后的数量限定符用来限定前面这个字符允许出现的个数。最常见的数量限定符包括“+”,“?”和“*”(不加数量限定则代表出现一次且仅出现一次):+ 加号代表前面的字符必须至少出现一次。(1次,或多次)。例如,"goo+gle"可以匹配google,gooogle,goooogle等;</dd>? 问号代表前面的字符最多只可以出现一次。(0次,或1次)。例如,"colou?r"可以匹配colour或者color;</dd>* 星号代表前面的字符可以不出现,也可以出现一次或者多次。(0次,或1次,或多次)。例如,"0*42"可以匹配42,042,0042,00042等。</dd>匹配 圆括号可以用来定义操作符的范围和优先度。例如,"gr(a|e)y"等价于"gray|grey","(grand)?father"匹配father和grandfather。上述这些构造子都可以自由组合,因此,"H(ae?|�0�1)ndel"和"H(a|ae|�0�1)ndel"是相同的。精确的语法可能因不同的工具或程序而异。历史 最初的正则表达式出现于理论计算机科学的自动控制理论和形式语言理论中。在这些领域中有对计算(自动控制)的模型和对形式语言描述与分类的研究。1940年代,Warren McCulloch与Walter Pitts将神经系统中的神经元描述成小而简单的自动控制元。在1950年代,数学家斯蒂芬·科尔·克莱尼利用称之为正则集合的数学符号来描述此模型。肯·汤普逊将此符号系统引入编辑器QED,然后是Unix上的编辑器ed,并最终引入grep。自此,正则表达式被广泛地使用于各种Unix或者类似Unix的工具,例如Perl。Perl正则表达式源自于Henry Spencer写的regex,它已经演化成了pcre(Perl兼容正则表达式Perl Compatible Regular Expressions),一个由Philip Hazel开发的,为很多现代工具所使用的库。各计算机语言之间的正则表达式的整合目前开展的很差。未来的Perl6的子项目Apocalypse的设计中已考虑到了这点。形式语言理论 正则表达式可以用形式语言理论的方式来表达。正则表达式由常量和算子组成,它们分别指示字符串的集合和在这些集合上的运算。给定有限字母表 Σ 定义了下列常量:(“空集”) �6�1 指示集合 �6�1 (“空串”) ε 指示集合 {ε} (“文字字符”) 在 Σ 中的 a 指示集合 {a} 定义了下列运算:(“串接”) RS 指示集合 { αβ | α ∈ R ∧ β ∈ S }。例如 {"ab"|"c"}{"d"|"ef"} = {"abd", "abef", "cd", "cef"}。 (“选择”) R|S 指示 R 和 S 的并集。 (“Kleene星号”) R* 指示包含 ε 并且闭合在字符串串接下的 R 的最小超集。这是可以通过 R 中的零或多个字符串的串接得到所有字符串的集合。例如,{"ab", "c"}* = {ε, "ab", "c", "abab", "abc", "cab", "cc", "ababab", ... }。 上述常量和算子形成了克莱尼代数。很多课本使用对选择使用符号 ∪, + 或 ∨ 替代竖杠。为了避免括号,假定 Kleene 星号有最高优先级,接着是串接,接着是并集。如果没有歧义则可以省略括号。例如,(ab)c 可以写为 abc 而 a|(b(c*)) 可以写为 a|bc*。例子:a|b* 指示 {ε, a, b, bb, bbb, ...}。 (a|b)* 指示由包括空串、任意数目个 a 和 b 字符组成的所有字符串的集合。 ab*(c|ε) 指示开始于一个 a 接着零或多个 b 和最终可选的一个 c 的字符串的集合。 正则表达式的形式定义故意非常精简,避免定义多余的量词 ? 和 +,它们可以被表达为: a+ = aa* 和 a? = (a|ε)。有时增加补算子 ~ ;~R 指示在 Σ* 上的不在 R 中的所有字符串的集合。补算子是多余的,因为它使用其他算子来表达(尽管计算这种表示的过程是复杂的,而结果可能指数性的增大)。这种意义上的正则表达式可以表达正则语言,精确的是可被有限状态自动机接受的语言类。但是在简洁性上有重要区别。某类正则语言只能用大小指数增长的自动机来描述,而要求的正则表达式的长度只线性的增长。正则表达式对应于乔姆斯基层级的类型-3文法。在另一方面,在正则表达式和不导致这种大小上的爆炸的非确定有限状态自动机(NFA)之间有简单的映射;为此 NFA 经常被用作正则表达式的替代表示。我们还要在这种形式化中研究表达力。如下面例子所展示的,不同的正则表达式可以表达同样的语言: 这种形式化中存在着冗余。有可能对两个给定正则表达式写一个算法来判定它们所描述的语言是否本质上相等,简约每个表达式到极小确定有限自动机,确定它们是否同构(等价)。这种冗余可以消减到什么程度? 我们可以找到仍有完全表达力的正则表达式的有趣的子集吗? Kleene 星号和并集明显是需要的,但是我们或许可以限制它们的使用。这提出了一个令人惊奇的困难问题。因为正则表达式如此简单,没有办法在语法上把它重写成某种规 范形式。过去公理化的缺乏导致了星号高度问题。最近 Dexter Kozen 用克莱尼代数公理化了正则表达式。很多现实世界的“正则表达式”引擎实现了不能用正则表达式代数表达的特征。表达式全集 正则表达式有多种不同的风格。下表是在PCRE中元字符及其在正则表达式上下文中的行为的一个完整列表:字符描述\将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“n”匹配字符“n”。“\n”匹配一个换行符。序列“\\”匹配“\”而“\(”则匹配“(”。^匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“\n”或“\r”之后的位置。$匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前的位置。*匹配前面的子表达式零次或多次。例如,zo*能匹配“z”以及“zoo”。*等价于{0,}。+匹配前面的子表达式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。?匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“do”或“does”中的“do”。?等价于{0,1}。{n}n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o。{n,}n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有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”在内的任何字符,请使用像“[.\n]”的模式。(pattern)匹配pattern并获取这一匹配。所获取的匹配可以从产生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中则使用$0…$9属性。要匹配圆括号字符,请使用“\(”或“\)”。(?:pattern)匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用“或”字符(|)来组合一个模式的各个部分是很有用。例如,“instr(?:y|ies)就是一个比”instry|instries'更简略的表达式。(?=pattern)正向预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如, “Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中 的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。(?!pattern)负向预查,在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如 “Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中 的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始x|y匹配x或y。例如,“z|food”能匹配“z”或“food”。“(z|f)ood”则匹配“zood”或“food”。[xyz]字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”。[^xyz]负值字符集合。匹配未包含的任意字符。例如,“[^abc]”可以匹配“plain”中的“p”。[a-z]字符范围。匹配指定范围内的任意字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符。[^a-z]负值字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范围内的任意字符。\b匹配一个单词边界,也就是指单词和空格间的位置。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。\B匹配非单词边界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。\cx匹配由x指明的控制字符。例如,\cM匹配一个Control-M或回车符。x的值必须为A-Z或a-z之一。否则,将c视为一个原义的“c”字符。\d匹配一个数字字符。等价于[0-9]。\D匹配一个非数字字符。等价于[^0-9]。\f匹配一个换页符。等价于\x0c和\cL。\n匹配一个换行符。等价于\x0a和\cJ。\r匹配一个回车符。等价于\x0d和\cM。\s匹配任何空白字符,包括空格、制表符、换页符等等。等价于[\f\n\r\t\v]。\S匹配任何非空白字符。等价于[^\f\n\r\t\v]。\t匹配一个制表符。等价于\x09和\cI。\v匹配一个垂直制表符。等价于\x0b和\cK。\w匹配包括下划线的任何单词字符。等价于“[A-Za-z0-9_]”。\W匹配任何非单词字符。等价于“[^A-Za-z0-9_]”。\xn匹配n,其中n为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,“\x41”匹配“A”。“\x041”则等价于“\x04”&“1”。正则表达式中可以使用ASCII编码。.\num匹配num,其中num是一个正整数。对所获取的匹配的引用。例如,“(.)\1”匹配两个连续的相同字符。\n标识一个八进制转义值或一个向后引用。如果\n之前至少n个获取的子表达式,则n为向后引用。否则,如果n为八进制数字(0-7),则n为一个八进制转义值。\nm标识一个八进制转义值或一个向后引用。如果\nm之前至少有nm个获得子表达式,则nm为向后引用。如果\nm之前至少有n个获取,则n为一个后跟文字m的向后引用。如果前面的条件都不满足,若n和m均为八进制数字(0-7),则\nm将匹配八进制转义值nm。\nml如果n为八进制数字(0-3),且m和l均为八进制数字(0-7),则匹配八进制转义值nml。\un匹配n,其中n是一个用四个十六进制数字表示的Unicode字符。例如,\u00A9匹配版权符号(�0�8)。范例 以下以php的语法所写的范例验证字串是否只含数字与英文, 字串长度并在4~16个字符之间 <?php
$str = 'a1234';
if (preg_match("^[a-zA-Z0-9]{4,16}$", $str)) {
echo "验证成功";
} else {
echo "验证失败";
}
?> 简易的台湾身份证字号验证 <?php
$str = 'a1234';
if (preg_match("^[A-Z]{1}[1-2]{1}[0-9]{8}$", $str)) {
echo "验证成功";
} else {
echo "验证失败";
}
?>

❷ 正则表达式原理

首先先讲解下正则表达式的基础知识:

1.字符串的组成

对于字符串”123“而言,包括三个字符四个位置。如下图所示:

2.占有字符和零宽度

正则表达式匹配过程中,如果子表达式匹配到东西,而并非是一个位置,并最终保存到匹配的结果当中。这样的就称为占有字符,而只匹配一个位置,或者是匹配的内容并不保存到匹配结果中,这种就称作零宽度,后续会讲到的零宽度断言等。占有字符是互斥的,零宽度是非互斥的。也就是一个字符,同一时间只能由一个子表达式匹配,而一个位置,却可以同时由多个零宽度的子表达式匹配。

3.控制权和传动

正则表达式由左到右依次进行匹配,通常情况下是由一个表达式取得控制权,从字符串的的某个位置进行匹配,一个子表达式开始尝试匹配的位置,是从前一子表达匹配成功的结束位置开始的(例如:(表达式一)(表达式二)意思就是表达式一匹配完成后才能匹配表达式二,而匹配表达式二的位置是从表达式一的位置匹配结束后的位置开始)。如果表达式一是零宽度,那表达式一匹配完成后,表达式二匹配的位置还是原来表达式以匹配的位置。也就是说它匹配开始和结束的位置是同一个。

举一个简单的例子进行说明:正则表达式:123

源数据:123

讲解:首先正则表达式是从最左侧开始进行匹配,也就是位置0处进行匹配,首先得到控制权的是正则表达式中的“1”,而不是源数据中的“1”,匹配源数据中的“1”,匹配成功,将源数据的“1”进行保存到匹配的结果当中,这就表明它占有了一个字符,接下来就将控制权传给正则表达式中的“2”,匹配的位置变成了位置1,匹配源数据中的“2”,匹配成功,将控制权又传动给了正则表达式的“3”,这时候匹配的位置变成了位置2,这时候就会将源数据中的“3”进行匹配。又有正则表达式“3”进行传动控制权,发现已经到了正则表达式的末尾,正则表达式结束。

❸ 如何使用正则表达式匹配左右括号

用C#语言的正则表达式中的平衡组就可以实现你的要求,完整的程序如下

using System;

using System.Text.RegularExpressions;

namespace MatchApplication{

class MatchProgram{

static void Main(string[] args){

string str="var c= 2*(function(a)-function1(function2(a+b*2),3))+4*5;";

string pattern = @"(function|function1)([^()]*(((?'Open'()[^()]*)+((?'-Open'))[^()]*)+)*(?(Open)(?!)))";

MatchCollection mc=Regex.Matches(str, pattern);

foreach (Match m in mc){

Console.WriteLine(m.Groups[0]);

}

}

}

}

❹ 正则表达式


目前,正则表达式已经在很多软件中得到广泛的应用,包括*nix(Linux, Unix等),HP等操作系统,PHP,C#,java等开发环境,以及很多的应用软件中,都可以看到正则表达式的影子。

正则表达式的使用,可以通过简单的办法来实现强大的功能。为了简单有效而又不失强大,造成了正则表达式代码的难度较大,学习起来也不是很容易,所以需要付出一些努力才行,入门之后参照一定的参考,使用起来还是比较简单有效的。

例子: ^.+@.+\\..+$

2. 正则表达式的历史

正则表达式的“祖先”可以一直上溯至对人类神经系统如何工作的早期研究。Warren McCulloch 和 Walter Pitts 这两位神经生理学家研究出一种数学方式来描述这些神经网络。
1956 年, 一位叫 Stephen Kleene 的数学家在 McCulloch 和 Pitts 早期工作的基础上,发表了一篇标题为“神经网事件的表示法”的论文,引入了正则表达式的概念。正则表达式就是用来描述他称为“正则集的代数”的表达式,因此采用“正则表达式”这个术语。

随后,发现可以将这一工作应用于使用 Ken Thompson 的计算搜索算法的一些早期研究,Ken Thompson 是 Unix 的主要发明人。正则表达式的第一个实用应用程序就是 Unix 中的 qed 编辑器。

如他们所说,剩下的就是众所周知的历史了。从那时起直至现在正则表达式都是基于文本的编辑器和搜索工具中的一个重要部分
3. 正则表达式定义
正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。

列目录时, dir *.txt或ls *.txt中的*.txt就不是一个正则表达式,因为这里*与正则式的*的含义是不同的。
正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。

3.1 普通字符
由所有那些未显式指定为元字符的打印和非打印字符组成。这包括所有的大写和小写字母字符,所有数字,所有标点符号以及一些符号。

3.2 非打印字符 字符 含义
\cx 匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。
\f 匹配一个换页符。等价于 \x0c 和 \cL。
\n 匹配一个换行符。等价于 \x0a 和 \cJ。
\r 匹配一个回车符。等价于 \x0d 和 \cM。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\t 匹配一个制表符。等价于 \x09 和 \cI。
\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。

3.3 特殊字符

所谓特殊字符,就是一些有特殊含义的字符,如上面说的"*.txt"中的*,简单的说就是表示任何字符串的意思。如果要查找文件名中有*的文件,则需要对*进行转义,即在其前加一个\。ls \*.txt。正则表达式有以下特殊字符。

特别字符 说明
$ 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,请使用 \$。
( ) 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \)。
* 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。
+ 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。
. 匹配除换行符 \n之外的任何单字符。要匹配 .,请使用 \。
[ 标记一个中括号表达式的开始。要匹配 [,请使用 \[。
? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?。
\ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\\' 匹配 "\",而 '\(' 则匹配 "("。
^ 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 \^。
{ 标记限定符表达式的开始。要匹配 {,请使用 \{。
| 指明两项之间的一个选择。要匹配 |,请使用 \|。

构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与操作符将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。

3.4 限定符

限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有*或+或?或或或共6种。
*、+和?限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。
正则表达式的限定符有:

字符 描述
* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于。
+ 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 。
? 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 。
n 是一个非负整数。匹配确定的 n 次。例如,'o' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
n 是一个非负整数。至少匹配n 次。例如,'o' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o' 等价于 'o+'。'o' 则等价于 'o*'。
m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o" 将匹配 "fooooood" 中的前三个 o。'o' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。

3.5 定位符

用来描述字符串或单词的边界,^和$分别指字符串的开始与结束,\b描述单词的前或后边界,\B表示非单词边界。不能对定位符使用限定符。

3.6 选择

用圆括号将所有选择项括起来,相邻的选择项之间用|分隔。但用圆括号会有一个副作用,是相关的匹配会被缓存,此时可用?:放在第一个选项前来消除这种副作用。
其中?:是非捕获元之一,还有两个非捕获元是?=和?!,这两个还有更多的含义,前者为正向预查,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串,后者为负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串。

3.7 后向引用

对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左至右所遇到的内容存储。存储子匹配的缓冲区编号从 1 开始,连续编号直至最大 99 个子表达式。每个缓冲区都可以使用 '\n' 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。
可以使用非捕获元字符 '?:', '?=', or '?!' 来忽略对相关匹配的保存。

❺ 请问JAVA中正则表达式匹配怎么实现的!

Java中正则表达式匹配的语法规则:

packageorg.luosijin.test;
importjava.util.regex.Matcher;
importjava.util.regex.Pattern;

/**
*正则表达式
*@versionV5.0
*@authorAdmin
*@date2015-7-25
*/
publicclassRegex{

/**
*@paramargs
*@authorAdmin
*@date2015-7-25
*/

publicstaticvoidmain(String[]args){
Patternpattern=Pattern.compile("b*g");
Matchermatcher=pattern.matcher("bbg");
System.out.println(matcher.matches());
System.out.println(pattern.matches("b*g","bbg"));
//验证邮政编码
System.out.println(pattern.matches("[0-9]{6}","200038"));
System.out.println(pattern.matches("//d{6}","200038"));
//验证电话号码
System.out.println(pattern.matches("[0-9]{3,4}//-?[0-9]+","02178989799"));
getDate("Nov10,2009");
charReplace();
//验证身份证:判断一个字符串是不是身份证号码,即是否是15或18位数字。
System.out.println(pattern.matches("^//d{15}|//d{18}$","123456789009876"));
getString("D:/dir1/test.txt");
getChinese("welcometochina,江西奉新,welcome,你!");
validateEmail("[email protected]");
}
/**
*日期提取:提取出月份来
*@paramstr
*@authorAdmin
*@date2015-7-25
*/
publicstaticvoidgetDate(Stringstr){
StringregEx="([a-zA-Z]+)|//s+[0-9]{1,2},//s*[0-9]{4}";
Patternpattern=Pattern.compile(regEx);
Matchermatcher=pattern.matcher(str);
if(!matcher.find()){
System.out.println("日期格式错误!");
return;
}
System.out.println(matcher.group(1));//分组的索引值是从1开始的,所以取第一个分组的方法是m.group(1)而不是m.group(0)。
}
/**
*字符替换:本实例为将一个字符串中所有包含一个或多个连续的“a”的地方都替换成“A”。
*
*@authorAdmin
*@date2015-7-25
*/
publicstaticvoidcharReplace(){
Stringregex="a+";
Patternpattern=Pattern.compile(regex);
Matchermatcher=pattern.matcher("okaaaaLetmeAseeaaaaabooa");
Strings=matcher.replaceAll("A");
System.out.println(s);
}
/**
*字符串提取
*@paramstr
*@authorAdmin
*@date2015-7-25
*/
publicstaticvoidgetString(Stringstr){
Stringregex=".+/(.+)$";
Patternpattern=Pattern.compile(regex);
Matchermatcher=pattern.matcher(str);
if(!matcher.find()){
System.out.println("文件路径格式不正确!");
return;
}
System.out.println(matcher.group(1));
}
/**
*中文提取
*@paramstr
*@authorAdmin
*@date2015-7-25
*/
publicstaticvoidgetChinese(Stringstr){
Stringregex="[//u4E00-//u9FFF]+";//[//u4E00-//u9FFF]为汉字
Patternpattern=Pattern.compile(regex);
Matchermatcher=pattern.matcher(str);
StringBuffersb=newStringBuffer();
while(matcher.find()){
sb.append(matcher.group());
}
System.out.println(sb);
}
/**
*验证Email
*@paramemail
*@authorAdmin
*@date2015-7-25
*/
publicstaticvoidvalidateEmail(Stringemail){
Stringregex="[0-9a-zA-Z]+@[0-9a-zA-Z]+//.[0-9a-zA-Z]+";
Patternpattern=Pattern.compile(regex);
Matchermatcher=pattern.matcher(email);
if(matcher.matches()){
System.out.println("这是合法的Email");
}else{
System.out.println("这是非法的Email");
}
}
}

❻ 请教正则表达式的算法

正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表通常被用来检索、替换那些符合某个模式(规则)的文本。

❼ C++ 正则表达式匹配curl爬取网页的指定内容

程序如下:

$pattern='/<divclass="nav"monkey="nav">(.+?)<divclass="head-ad">/is';
preg_match($pattern,$string,$match);
//$match[0]即为<divclass="nav"monkey="nav">和<divclass="head-ad">之间的所有源码
echo$match[0];

//然后再提取<li></li>之间的内容
$pattern='/<li.*?>(.+?)</li>/is';

preg_match_all($pattern,$match[0],$results);
$new_arr=array_unique($results[0]);

foreach($new_arras$kkk){
echo$kkk;

}

❽ 正则表达式算法

使用队列去实现也可以,

第一,你要编写一个类,去保存表达式的子表达式,也就是匹配区间,并记录匹配的规则:是否可选,是否可重复

然后分析表达式(整个表达式),把每一步分析得到的表达式封装成上面提到的类保存到队列中

最后依次从队列中取出表达式,去匹配字符串

❾ 算法和正则表达式的区别

算法和正则正则 这两者貌似没什么关系吧 . 算法是实现某种目的的过程.
在C语言里是一个函数 , java里是一个方法 , 正则表达式是一个匹配字符串的规则 , 一种模式.
正则当然是通过算法来实现的 , java里的Patter 类底层代码怎么实现正则的匹配功能?就是通过算法 .
比如 js里像这样一个正则: /\w{3}\d/ 表示匹配"3个字母一个数字"的字符串
正则的作用就是通过匹配来验证数据是否是指定的格式 , 比如在你注册帐号的时候匹配你的用户名密码是否按照要求填写 , 你的邮箱格式是否正确 , 还有就是正则可以方便的处理字符串的替换, 比如有的时候你得到一个几千行的字符串 你需要将每一行用引号引起来然后再末尾加个逗号 , 这时候手动处理的话要发疯 , 就可以用带有正则替换功能的工具处理 , 秒秒钟搞定,
程序里也一样,方便的替换掉匹配到的某些字符串.

❿ 正则表达式匹配算法在网络安全的哪些领域起着重要的作用

正则没办法直接得到,需要和程序语言一同处理。
以“”字串为例,正则只写出匹配3个数字的表达式即可(\d{3}),匹配一次
得到"123"和 “1”在原来字符中的位置[一般正则都能得到],从此位置+1到原来字串的末尾得到新的字符串,再用正则搜索新的字串,……循环直至匹配不到结果为止。
字串截取、循环匹配需要程序语言

阅读全文

与正则表达式匹配算法相关的资料

热点内容
喷油螺杆制冷压缩机 浏览:581
python员工信息登记表 浏览:377
高中美术pdf 浏览:161
java实现排列 浏览:513
javavector的用法 浏览:982
osi实现加密的三层 浏览:233
大众宝来原厂中控如何安装app 浏览:916
linux内核根文件系统 浏览:243
3d的命令面板不见了 浏览:526
武汉理工大学服务器ip地址 浏览:149
亚马逊云服务器登录 浏览:525
安卓手机如何进行文件处理 浏览:71
mysql执行系统命令 浏览:930
php支持curlhttps 浏览:143
新预算法责任 浏览:444
服务器如何处理5万人同时在线 浏览:251
哈夫曼编码数据压缩 浏览:428
锁定服务器是什么意思 浏览:385
场景检测算法 浏览:617
解压手机软件触屏 浏览:352