Delphi中使用正则式RegExpr类

【菜科解读】
在 Delphi 中是没有自带的正则表达式库的,在网上能找到的用于 Delphi 的正则表达式类大体上有两个,分别是 PerlRegEx 和 RegExpr。
前者相当强大,但发布程序时需要带上他的一个 DLL 文件,感觉很麻烦。
而后者是完全使用 Delphi 来实现,虽然功能稍微逊色,但是发布和使用较为方便,直接使用源文件,而发布时也无须增加任何文件。
那么我们就来说说后者,顺便学习一下。
源文件与示例下载:http://regexpstudio.com/TRegExpr/TRegExpr.html
附加工具RegExpStudio下载:http://regexpstudio.com/RegExpStudio.html
正则表达式语法:http://regexpstudio.com/TRegExpr/Help/RegExp_Syntax.html
要使用他只需要添加RegExpr.pas到你的project(Delphi主菜单 Project -> Add to project..),然后在要使用正则的单元里申明就行了,如:
implementationusesRegExpr;{$R *.DFM}
注意,最好添加在 implementation 之后,而不是 interface 之后。
interface 后面使用的是系统自带的,而 implementation 后是自定义的。
一个简单的示例,提取所有的邮箱的函数,调用此函数会返回文本里所有的邮箱:
function ExtractEmails(const AInputString: string): string;constEmailRE = '[_a-zA-Z\d\-\.]+@[_a-zA-Z\d\-]+(\.[_a-zA-Z\d\-]+)+';varr: TRegExpr;beginResult := '';r := TRegExpr.Create;try r.Expression := EmailRE; if r.Exec(AInputString) then repeat Result := Result + r.Match[0] + ','; until not r.ExecNext;finally r.Free;end;end;
下面是我从 Help 文件里翻译出的一些主要接口的说明:(注:有英语大虾吗?希望那位英语大虾能全部都翻译出来。
)
class function VersionMajor : integer;返回主版本号。
class function VersionMinor : integer;返回副版本号。
比如我下载的版本是 v0.944,那么 VersionMajor = 0、VersionMinor = 944,是无多大实际意义的方法啊。
function Exec (const AInputString : string) : boolean;返回字符串 AInputString 是否匹配。
function ExecNext : boolean;查找是否还有下一个匹配项。
property MatchPos [Idx : integer] : integer;返回指定的匹配字符串的起始位置。
property MatchLen [Idx : integer] : integer;返回指定的匹配字符串的长度。
property Match [Idx : integer] : string;返回指定的匹配字符串。
function ReplaceRegExpr (const ARegExpr, AInputStr, AReplaceStr : string; AUseSubstitution : boolean = False) : string;将匹配的所有字符串替换成 AReplaceStr 并返回。
另外 \n 表示回车,\s 表示空格,^ 表示取反,- 表示连接(如a-z,表示24个小写的英文字母),| 表示或,& 表示和。
接下来的语句中出现的myExpr.Match[1],则用以取出本次匹配结果
最后的ExecNext其实是使用了上面提到的第三个重载,用来对重复出现的字符串进行连续匹配,返回结果的含义同Exec相同
接下来谈谈Match成员,其中Match[0]表示整个表达式的匹配结果,之后的数组元素则代表括号中的匹配结果,元素编号按照括号从左到右的顺序递增,嵌套括号则以从内向外的顺序递增。
例如一个简单的对E-Mail地址的匹配:Quotes From ???输入字符串:'"dirt@sina.com","v@d2g.com"'正则表达式:'"((.*?)@(.*?))",'执行结果如下:0 "dirt@sina.com",1 dirt@sina.com2 dirt3 sina.com从中即可看出Match数组中的结果排列顺序。
而上文中出现的.*?经常用于不很严谨的场合,例如前面用到的邮件地址提取,有人就写出几百字符的的验证表达式。
其中“.”表示任意单个字符,“*” 表示前面的字符(串)至少出现一次,而'?'在这里就是非贪婪限定符,举一个简单的例子:"aaa""bbb",这样一个字符串,如果用'" (.*?)"'进行匹配,则Match[1]的内容就是'aaa',如果去掉了其中的'?',则Match[1]就变成了'aaa""bbb',这就可以 看出贪婪和非贪婪的区别。
一个基本的匹配过程就到这里,有空会再继续写一些其他的相关内容,敬请丢砖
转自:http://www.delphibbs.com/keylife/iblog_show.asp?xid=13902作者:coolbaby
TRegExpr是正则表达式在delphi中的一个很好的实现。
是一个单独的单元,使用时直接引用即可。
还自带了几个sample。
对其中的SelfTest例子加了几行注释如下:{ basic tests }
r := TRegExpr.Create;
r.Expression := '[A-Z]';r.Exec ('234578923457823659GHJK38');Check (0, 19, 1);//?在此处表示让*处于非贪婪模式r.Expression := '[A-Z]*?';r.Exec ('234578923457823659ARTZU38');Check (0, 1, 0);
r.Expression := '[A-Z]+';r.Exec ('234578923457823659ARTZU38');Check (0, 19, 5);//和上面的+方式,功能一样r.Expression := '[A-Z][A-Z]*';r.Exec ('234578923457823659ARTZU38');Check (0, 19, 5);//?这里表示匹配[A-Z]0次或者一次r.Expression := '[A-Z][A-Z]?';r.Exec ('234578923457823659ARTZU38');Check (0, 19, 2);// \d代表数字,^代表非,总得来说就是一个或者多个非数字字符 r.Expression := '[^\d]+';r.Exec ('234578923457823659ARTZU38');Check (0, 19, 5);
半小时精通正则表达式 作者:Web应用网 来源:Web应用网
跟我学正则表达式! 想必很多人都对正则表达式都头疼.今天,我以我的认识,加上网上一些文章,希望用常人都可以理解的表达方式.来和大家分享学习经验.开篇,还是得说说 ^ 和 $ 他们是分别用来匹配字符串的开始和结束,以下分别举例说明
"^The": 开头一定要有"The"字符串; "of despair$": 结尾一定要有"of despair" 的字符串;
那么,"^abc$": 就是要求以abc开头和以abc结尾的字符串,实际上是只有abc匹配 "notice": 匹配包含notice的字符串
你可以看见如果你没有用我们提到的两个字符(最后一个例子),就是说 模式(正则表达式) 可以出现在被检验字符串的任何地方,你没有把他锁定到两边 接着,说说 '*', '+',和 '?', 他们用来表示一个字符可以出现的次数或者顺序. 他们分别表示:"zero or more"相当于{0,}, "one or more"相当于{1,}, "zero or one."相当于{0,1}, 这里是一些例子:
"ab*": 和ab{0,}同义,匹配以a开头,后面可以接0个或者N个b组成的字符串("a", "ab", "abbb", 等); "ab+": 和ab{1,}同义,同上条一样,但最少要有一个b存在 ("ab", "abbb", 等.); "ab?":和ab{0,1}同义,可以没有或者只有一个b; "a?b+$": 匹配以一个或者0个a再加上一个以上的b结尾的字符串. 要点, '*', '+',和 '?'只管它前面那个字符.
你也可以在大括号里面限制字符出现的个数,比如
"ab{2}": 要求a后面一定要跟两个b(一个也不能少)("abb"); "ab{2,}": 要求a后面一定要有两个或者两个以上b(如"abb", "abbbb", 等.); "ab{3,5}": 要求a后面可以有2-5个b("abbb", "abbbb", or "abbbbb").
现在我们把一定几个字符放到小括号里,比如:"a(bc)*": 匹配 a 后面跟0个或者一个"bc"; "a(bc){1,5}": 一个到5个 "bc."
还有一个字符 '│', 相当于OR 操作:
"hi│hello": 匹配含有"hi" 或者 "hello" 的 字符串; "(b│cd)ef": 匹配含有 "bef" 或者 "cdef"的字符串; "(a│b)*c": 匹配含有这样多个(包括0个)a或b,后面跟一个c 的字符串;
一个点('.')可以代表所有的单一字符,不包括"\n"如果,要匹配包括"\n"在内的所有单个字符,怎么办?对了,用'[\n.]'这种模式.
"a.[0-9]": 一个a加一个字符再加一个0到9的数字 "^.{3}$": 三个任意字符结尾 .
中括号括住的内容只匹配一个单一的字符
"[ab]": 匹配单个的 a 或者 b ( 和 "a│b" 一样); "[a-d]": 匹配'a' 到'd'的单个字符 (和"a│b│c│d" 还有 "[abcd]"效果一样); 一般我们都用[a-zA-Z]来指定字符为一个大小写英文"^[a-zA-Z]": 匹配以大小写字母开头的字符串 "[0-9]%": 匹配含有 形如 x% 的字符串 ",[a-zA-Z0-9]$": 匹配以逗号再加一个数字或字母结尾的字符串
你也可以把你不想要得字符列在中括号里,你只需要在总括号里面使用'^' 作为开头 "%[^a-zA-Z]%" 匹配含有两个百分号里面有一个非字母的字符串. 要点:^用在中括号开头的时候,就表示排除括号里的字符 为了PHP能够解释,你必须在这些字符面前后加'',并且将一些字符转义. 不要忘记在中括号里面的字符是这条规路的例外—在中括号里面, 所有的特殊字符,包括(''), 都将失去他们的特殊性质 "[*\+?{}.]"匹配含有这些字符的字符串.还有,正如regx的手册告诉我们: "如果列表里含有 ']', 最好把它作为列表里的第一个字符(可能跟在'^'后面). 如果含有'-', 最好把它放在最前面或者最后面, or 或者一个范围的第二个结束点[a-d-0-9]中间的‘-’将有效. 看了上面的例子,你对{n,m}应该理解了吧.要注意的是,n和m都不能为负整数,而且n总是小于m. 这样,才能 最少匹配n次且最多匹配m次. 如"p{1,5}"将匹配 "pvpppppp"中的前五个p下面说说以\开头的\b 书上说他是用来匹配一个单词边界,就是...比如've\b',可以匹配love里的ve而不匹配very里有ve\B 正好和上面的\b相反.例子我就不举了.....突然想起来....可以到http://www.phpv.net/article.php/251 看看其它用\ 开头的语法
好,我们来做个应用:如何构建一个模式来匹配 货币数量 的输入 构建一个匹配模式去检查输入的信息是否为一个表示money的数字。
我们认为一个表示money的数量有四种方式: "10000.00" 和 "10,000.00",或者没有小数部分, "10000" and "10,000". 现在让我们开始构建这个匹配模式: ^[1-9][0-9]*$ 这是所变量必须以非0的数字开头.但这也意味着 单一的 "0" 也不能通过测试. 以下是解决的方法: ^(0│[1-9][0-9]*)$ "只有0和不以0开头的数字与之匹配",我们也可以允许一个负号在数字之前: ^(0│-?[1-9][0-9]*)$ 这就是: "0 或者 一个以0开头 且可能 有一个负号在前面的数字." 好了,现在让我们别那么严谨,允许以0开头.现在让我们放弃 负号 , 因为我们在表示钱币的时候并不需要用到. 我们现在指定 模式 用来匹配小数部分: ^[0-9]+(\.[0-9]+)?$ 这暗示匹配的字符串必须最少以一个阿拉伯数字开头. 但是注意,在上面模式中 "10." 是不匹配的, 只有 "10" 和 "10.2" 才可以. (你知道为什么吗) ^[0-9]+(\.[0-9]{2})?$ 我们上面指定小数点后面必须有两位小数.如果你认为这样太苛刻,你可以改成: ^[0-9]+(\.[0-9]{1,2})?$ 这将允许小数点后面有一到两个字符. 现在我们加上用来增加可读性的逗号(每隔三位), 我们可以这样表示: ^[0-9]{1,3}(,[0-9]{3})*(\.[0-9]{1,2})?$ 不要忘记 '+' 可以被 '*' 替代 如果你想允许空白字符串被输入话 (为什么?). 也不要忘记反斜杆 ’\’ 在php字符串中可能会出现错误 (很普遍的错误). 现在,我们已经可以确认字符串了, 我们现在把所有逗号都去掉 str_replace(",", "", $money) 然后在把类型看成 double然后我们就可以通过他做数学计算了.
再来一个:构造检查email的正则表达式 在一个完整的email地址中有三个部分: 1. 用户名 (在 '@' 左边的一切), 2.'@',3. 服务器名(就是剩下那部分). 用户名可以含有大小写字母阿拉伯数字,句号 ('.'), 减号('-'), and 下划线 ('_'). 服务器名字也是符合这个规则,当然下划线除外. 现在, 用户名的开始和结束都不能是句点. 服务器也是这样. 还有你不能有两个连续的句点他们之间至少存在一个字符,好现在我们来看一下怎么为用户名写一个匹配模式: ^[_a-zA-Z0-9-]+$ 现在还不能允许句号的存在. 我们把它加上: ^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*$ 上面的意思就是说: "以至少一个规范字符(除了.)开头,后面跟着0个或者多个以点开始的字符串." 简单化一点, 我们可以用 eregi()取代 ereg().eregi()对大小写不敏感, 我们就不需要指定两个范围 "a-z" 和 "A-Z" – 只需要指定一个就可以了: ^[_a-z0-9-]+(\.[_a-z0-9-]+)*$ 后面的服务器名字也是一样,但要去掉下划线: ^[a-z0-9-]+(\.[a-z0-9-]+)*$ 好. 现在只需要用”@”把两部分连接: ^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$
这就是完整的email认证匹配模式了,只需要调用 eregi(‘^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$ ’,$eamil) 就可以得到是否为email了 正则表达式的其他用法 提取字符串 ereg() and eregi() 有一个特性是允许用户通过正则表达式去提取字符串的一部分(具体用法你可以阅读手册). 比如说,我们想从 path/URL 提取文件名 – 下面的代码就是你需要: ereg("([^\\/]*)$", $pathOrUrl, $regs); echo $regs[1]; 高级的代换 ereg_replace() 和 eregi_replace()也是非常有用的: 假如我们想把所有的间隔负号都替换成逗号: ereg_replace("[ \n\r\t]+", ",", trim($str));最后,我把另一串检查EMAIL的正则表达式让看文章的你来分析一下."^[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+'.'@'.'[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.'.'[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+$"如果能方便的读懂,那这篇文章的目的就达到了.
JScript 和 VBScript 正则表达式 的语法规则
一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。
该模式描述在查找文字主体时待匹配的一个或多个字符串。
正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
这里有一些可能会遇到的正则表达式示例:
JScript VBScript 匹配 /^\[ \t]*$/ "^\[ \t]*$" 匹配一个空白行。
/\d-\d/ "\d-\d" 验证一个ID 号码是否由一个2位数字,一个连字符以及一个5位数字组成。
/.* \/>/ ".* \/>" 匹配一个 HTML 标记。
下表是元字符及其在正则表达式上下文中的行为的一个完整列表:
字符 描述 \ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。
例如,'n' 匹配字符 "n"。
'\n' 匹配一个换行符。
序列 '\' 匹配 "\" 而 "\(" 则匹配 "("。
^ 匹配输入字符串的开始位置。
如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。
$ 匹配输入字符串的结束位置。
如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。
* 匹配前面的子表达式零次或多次。
例如,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 Delphi,中,使用,正则,式,RegExpr,类,前往,
新疆铁门关换工作中间断了一个月社保如何办?社保断缴了能补吗?(2025
它的主要目的是为劳动者提供基本的生活支撑,确保他们在遇到生活困难时能够得到一定的经济支持。
下面随新社通小编看看:新疆铁门关换工作中间断了一个月社保怎么办?社保断缴了能补吗?社保断了能补缴交吗新疆铁门关社保和医保断交后是可以补交的,但具体补交条件因地区、险种和断交时间长短而有所不同。
社保断了是可以进行补缴的。
根据相关法律法规,补缴社保可以通过以下几种方式实现:(一)单位补缴如果是由于单位的原因导致社保中断,那么单位应负责办理补缴手续。
单位可以携带相关证明材料到社保局进行申请,并按照缴费比例和缴费基数进行补缴。
如果个人因辞职等个人原因导致社保中断,也可以请求原单位帮忙补缴,但具体操作需要与原单位协商。
(二)个人补缴个人可以携带身份证原件直接到所在地的社保局办理补缴手续。
在办理过程中,个人需要向社保局提供相关的缴费记录、个人权益记录等证明材料,以便社保局核实个人的缴费情况并进行补缴。
(三)中介代缴此外,个人还可以选择通过社保代缴机构进行补缴。
这种方式需要个人支付一定的手续费和社保费用,然后代缴机构会协助个人完成补缴手续。
但需要注意的是,选择代缴机构时一定要谨慎,确保其具有资质和良好的信誉。
在补缴社保时,个人还需要注意以下几点:1、补缴的费用计算:补缴社保的费用是根据个人的缴费基数和缴费比例来计算的。
个人在办理补缴手续时需要向社保局提供相关的证明材料,以便社保局核实个人的缴费基数和缴费比例并进行费用计算。
2、补缴的时间限制:正常情况下,社保只能补缴过去一段时间内的费用,具体时间限制因地区而异。
因此,个人在办理补缴手续前需要了解清楚当地。
3、滞纳金和罚钱:如果单位未按时足额缴纳社会保险费,社保局会责令其限期缴纳或者补足,并自欠缴之日起按日加收万分之五的滞纳金。
逾期仍不缴纳的,相关部门会处欠缴数额一倍以上三倍以下的钱。
因此,个人在办理补缴手续时需要及时缴纳相关费用,以避免产生额外的滞纳金和钱。
另外,《中华人民共和国社会保险法》第八十六条和第六十三条用人单位未按时足额缴纳社会保险费的,由社会保险费征收机构责令限期缴纳或者补足,并自欠缴之日起按日加收滞纳金;逾期仍不缴纳的,将被处以罚钱。
因此,对于单位来说,及时足额缴纳社会保险费是法律的义务,必须严格遵守。
新疆铁门关社保缴费比例多少?新疆铁门关社保缴纳比例公司和个人怎么算养老保险单位缴纳19%,个人缴纳8%; 失业保险:企业缴纳比例:1%至2%,个人缴纳比例:一般为0.5%(也有地区为1%) 医疗保险:个人交纳2%,单位交纳10%; 工伤保险的缴费比例由用人单位全额承担,职工个人不需缴纳。
具体比例根据行业风险程度和工伤保险费使用情况等因素有所不同,一般来说,工伤保险的单位缴费比例在0.5%到1.6%之间。
生育保险:费用由单位承担,个人不用缴纳,缴纳比例为1%。
住房公积金的缴纳比例一般为:企业缴纳比例:5%,个人缴纳比例:5%。
社保卡如何供给家里人使用?能直接用家人的社保卡看病吗?(4月22日)
社保卡如何绑定家人一起使用随新社通小编来了解一下:社保卡里的职工个人账户如何共济给家人?社保卡里的余额给家人使用,需要怎么绑定呢,主要可以通过以下几种方式实现:一、电子社保卡亲情服务此外,还可以通过电子社保卡的亲情服务功能,为家人提供便捷的电子社保卡签发和应用服务。
具体步骤如下:打开电子社保卡首页,点击右上角“我的”-“亲情服务”。
点击“添加”,验证电子社保卡密码后,阅读并同意添加亲情账户告知书。
输入要开通人的姓名、社保号码、亲情关系,点击“添加亲情账户”并上传身份凭证(小于16岁需同时上传人脸正面照)。
亲情服务绑定对象进行人脸识别操作,认证通过后则开通亲情服务成功。
通过电子社保卡亲情服务,可以帮家人查询个人社保权益单、进行社保待遇资格认证、办理社保网上转移申请等,同时也可以使用社保卡里的余额。
二、社保卡绑定家人通过社保卡的家庭共享功能,可以将社保卡的余额绑定给家人使用。
具体操作步骤如下:社会保险服务个人网页自助办理:登陆个人网页,进入社保业务办理-医疗业务办理-个人账户家庭共享-新增绑定,输入亲属社保电脑号、亲属身份证号及亲属关系,提交保存,即完成绑定。
到社保分局医疗保险窗口申请办理:在社保部门医保现金报销窗口刷卡绑定,刷被使用人的社保卡,并录入使用人的社保卡号。
在定点医院医疗保险办公室办理:在医院医保办,通过“网上医院”刷卡绑定,刷被使用人的卡,并录入使用人的社保卡号。
完成绑定后,家人在就医时就可以使用社保卡里的余额进行支付了。
需要注意的是,社保卡里的余额属于个人所有,给家人使用时需确保符合要求,不得进行违法违规操作。
另外,不同地区的社保卡使用可能有所不同,具体操作方法还需根据当地而定。
什么是社保个人家庭账户共济?怎么理解的?自1998年建立以来,一直实行社会统筹和个人账户相结合的模式,职工医保个人账户资金可用于支付本人就医购药个人负担部分费用。
2021年,将职工医保个人账户使用范围从职工本人,扩大到其参加基本医保的“配偶、父母、子女”,即医保个人账户可共济给家人使用;今年7月,进一步将职工医保个人账户共济亲属的范围由“配偶、父母、子女”,扩大至其参加基本医保的“近亲属”。
根据《中华人民共和国民法典》,配偶、父母、子女、兄弟姐妹、祖父母、外祖父母、孙子女、外孙子女为近亲属。
自1998年建立以来,一直实行社会统筹和个人账户相结合的模式,职工医保个人账户资金可用于支付本人就医购药个人负担部分费用。
2021年,将职工医保个人账户使用范围从职工本人,扩大到其参加基本医保的“配偶、父母、子女”,即医保个人账户可共济给家人使用;今年7月,进一步将职工医保个人账户共济亲属的范围由“配偶、父母、子女”,扩大至其参加基本医保的“近亲属”。
根据《中华人民共和国民法典》,配偶、父母、子女、兄弟姐妹、祖父母、外祖父母、孙子女、外孙子女为近亲属。
目前首批开通个人账户跨省家庭共济的地区(统筹区)有哪些?1、山东省(德州市)2、河北省(石家庄市、唐山市、秦皇岛市、邯郸市、邢台市、保定市、张家口市、承德市、沧州市、廊坊市、衡水市、辛集市、定州市、雄安新区、省本级)3、湖北省(襄阳市、黄冈市、咸宁市、随州市、恩施土家族苗族自治州、潜江市)4、安徽省(淮南市)5、四川省(省本级、成都市、广安市)6、河南省(郑州市、信阳市)7、江苏省(苏州市)8、重庆市(云阳县)9、甘肃省(临夏回族自治州)共31个地区(统筹区)已开通个人账户跨省共济使用。