delphi 正则表达式的使用方法
<p><span style="font-family: 宋体, Songti SC">本文写于2022-10-14,D版本10.3.3</span></p><p><span style="font-family: 宋体, Songti SC">引用单元:</span></p>
<p><span style="font-family: 宋体, Songti SC">uses</span><br><span style="font-family: 宋体, Songti SC"> System.RegularExpressions</span></p>
<p><span style="font-family: 宋体, Songti SC"><strong>1、TRegEx.Match方法</strong></span></p>
<p><span style="font-family: 宋体, Songti SC">Match()方法总是获取满足条件的第一个匹配,而不关心满足条件的匹配有多少个。</span></p>
<p><span style="font-family: 宋体, Songti SC">Match()方法都回一个Match对象,其中包含了匹配的各种细节.</span></p>
<p><span style="font-family: 宋体, Songti SC">Match()方法的取值方法</span></p>
<p><span style="font-family: 宋体, Songti SC">var </span></p>
<p><span style="font-family: 宋体, Songti SC"> m:TMatch;</span></p>
<p><span style="font-family: 宋体, Songti SC">begin</span></p>
<p><span style="font-family: 宋体, Songti SC"> m := TRegEx.Match('a1a2','\d');</span></p>
<p><span style="font-family: 宋体, Songti SC"> showmessage(m.groups.item.value); //只能是0啊,因为它只取第一个匹配值.反过来,如果它一个都没有匹配到的话,连0都没了</span></p>
<p><span style="font-family: 宋体, Songti SC">end;</span></p>
<p><span style="font-family: 宋体, Songti SC">所以,一般地,当我们确定只有一个符合条件的匹配或只需要第一个符合条件的匹配时,可以使用Match()。</span></p>
你可以使用TMatch的NextMatch方法获取下一个匹配的字符串:<br> m:= m.NextMatch;<br>可以使用TMatch的Groups属性获取与分组的正则表达式匹配的字符串。<br style="font-family: 宋体, Songti SC">
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
match: TMatch;
group: TGroup;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
match :</span>= TRegEx.Match(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">2012/5/14</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">(\d+)/(\d+)/(\d)</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
ShowMessage(IntToStr(match.Groups.Count)); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">=> 4</span>
<span style="color: rgba(0, 0, 255, 1)">for</span> group <span style="color: rgba(0, 0, 255, 1)">in</span> match.Groups <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
ShowMessage(Format(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">%s (%d, %d)</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
));
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">(*</span><span style="color: rgba(0, 128, 0, 1)"> 結果
2012/5/1 (1, 8)
2012 (1, 4)
5 (6, 1)
1 (8, 1)
</span><span style="color: rgba(0, 128, 0, 1)">*)</span></pre>
</div>
<p> </p>
<span style="font-family: 宋体, Songti SC"><strong>2、TRegEx.IsMatch方法</strong></span><br>
<p><span style="font-family: 宋体, Songti SC"> isMatch()方法用于判断是否能匹配到符合条件的成员,返回一个Boolean值.</span></p>
<p><span style="font-family: 宋体, Songti SC"> TRegEx.Match('aAA','\d'); //返回false;</span></p>
<p><span style="font-family: 宋体, Songti SC"> TRegEx.Match('aAA','\w'); //返回true;</span></p>
<p><span style="font-family: 宋体, Songti SC"><strong>3、TRegEx.Match<span style="color: rgba(255, 0, 0, 1)">es</span>方法获取与正则表达式匹配的所有字符串.</strong></span></p>
<p><span style="font-family: 宋体, Songti SC"> Matches()方法可以得到MathCollection对象的一个集合。这个集合类中包含每一次正则表达式匹配的Match对象。</span></p>
<p><span style="font-family: 宋体, Songti SC"><strong> TRegEx.Match</strong>的声明是:</span></p>
<p><span style="font-family: 宋体, Songti SC"> M:TMatch;</span></p>
<p><span style="font-family: 宋体, Songti SC"> 而TRegEx.Matches声明的是:</span></p>
<p><span style="font-family: 宋体, Songti SC"> MC:TMatchCollection;</span></p>
<p><span style="font-family: 宋体, Songti SC"> 一般,当我们需要获取所有符合条件的匹配结果时,可以使用Matches()。</span></p>
<p><span style="font-family: 宋体, Songti SC">实例1:</span></p>
<div class="cnblogs_code">
<pre><span style="font-family: 宋体, Songti SC"><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TForm2.Button1Click(Sender: TObject);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
mc: TMatchCollection;
pattern, str: </span><span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">;
i: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
pattern :</span>= Edit2.Text; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">正则规则</span>
str :=<span style="color: rgba(0, 0, 0, 1)"> edit1.Text;
</span><span style="color: rgba(0, 0, 255, 1)">if</span> TRegEx.IsMatch(str, pattern) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> CheckBox1.Checked<span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
mc :</span>= TRegEx.Matches (str, pattern,) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">区分大小写</span>
<span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">
mc :</span>= TRegEx.Matches (str, pattern,); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">默认忽略大小写,所以这里可以省略第三参数</span>
<span style="color: rgba(0, 0, 0, 1)"> Memo1.Clear;
</span><span style="color: rgba(0, 0, 255, 1)">for</span> i := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> mc.Count - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Memo1.Lines.Add(mc.Item.Value);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span>;</span></pre>
</div>
<p> </p>
<span style="font-family: 宋体, Songti SC"><img src="https://img2022.cnblogs.com/blog/981841/202210/981841-20221014110953498-952862159.png"><img src="https://img2022.cnblogs.com/blog/981841/202210/981841-20221014111007296-134001000.png"><img src="https://img2022.cnblogs.com/blog/981841/202210/981841-20221014111034970-1925051381.png"><img src="https://img2022.cnblogs.com/blog/981841/202210/981841-20221014111108468-1176916534.png"></span>
<p> </p>
<p><span style="font-family: 宋体, Songti SC"> </span></p>
<p> </p>
<p><span style="font-family: 宋体, Songti SC"> 实例2:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
match: TMatch;
matches: TMatchCollection;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
matches :</span>= TRegEx.Matches(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Delphi XE</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">+</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
ShowMessage(IntToStr(matches.Count));
match :</span>= matches.Item[<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">];
ShowMessage(
Format(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">%s (%d, %d)</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
)); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">=> D (1, 1)</span>
<span style="color: rgba(0, 0, 0, 1)">
match :</span>= matches.Item[<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">];
ShowMessage(
Format(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">%s (%d, %d)</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
)); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">=> XE (8, 2)</span>
Matches方法支持in <span style="color: rgba(0, 0, 255, 1)">do</span><span style="color: rgba(0, 0, 0, 1)">。
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
regex: TRegEx;
match: TMatch;
matches: TMatchCollection;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
regex :</span>= TRegEx.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">+</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
matches :</span>= regex.Matches(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Delphi XE</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
ShowMessage(IntToStr(matches.Count));
</span><span style="color: rgba(0, 0, 255, 1)">for</span> match <span style="color: rgba(0, 0, 255, 1)">in</span> matches <span style="color: rgba(0, 0, 255, 1)">do</span><span style="color: rgba(0, 0, 0, 1)">
ShowMessage(
Format(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">%s (%d, %d)</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
));</span></pre>
</div>
4.TRegEx.Replace方法替换 与正则表达式匹配的字符串<br>s := TRegEx.Replace('Delphi XE', '', '_'); //=> _elphi __<br> 5.TRegEx.Split拆分方法 拆分字符串<br class="hljs-comment" style="color: rgba(0, 0, 0, 1)">
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
splits: TArray</span><<span style="color: rgba(0, 0, 255, 1)">string</span>><span style="color: rgba(0, 0, 0, 1)">;
s: </span><span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
splits :</span>= TRegEx.Split(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Delphi C++Builder/RadPHP</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">[ /]</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">for</span> s <span style="color: rgba(0, 0, 255, 1)">in</span> splits <span style="color: rgba(0, 0, 255, 1)">do</span><span style="color: rgba(0, 0, 0, 1)">
Memo1.Lines.Add(s);</span></pre>
</div>
<div><span class="hljs-comment" style="color: rgba(0, 0, 0, 1)"> </span></div>
<div><span class="hljs-comment" style="color: rgba(0, 0, 0, 1)">6.TRegEx.Escape转义方法转义 特殊字符</span></div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
s: </span><span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
s :</span>= TRegEx.Escape(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">C++</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
ShowMessage(s); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">=> C\+\+</span></pre>
</div>
<p> </p>
<br class="hljs-comment">
<div><span class="hljs-comment" style="color: rgba(0, 0, 0, 1)">验证正则表达式语法</span></div>
<div><span class="hljs-comment" style="color: rgba(0, 0, 0, 1)">如果在构造函数参数中指定了roCompiled,则将编译正则表达式。</span></div>
<div><span class="hljs-comment" style="color: rgba(0, 0, 0, 1)">如果正则表达式有问题,则引发异常。</span></div>
<div> </div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">
TRegEx.</span><span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">(Edit1.Text, );
</span><span style="color: rgba(0, 0, 255, 1)">except</span> on E: Exception <span style="color: rgba(0, 0, 255, 1)">do</span><span style="color: rgba(0, 0, 0, 1)">
ShowMessage(E.Message);
</span><span style="color: rgba(0, 0, 255, 1)">end</span>;</pre>
</div>
<p> </p>
<br class="hljs-comment">
<p> </p>
<p><span style="font-family: 宋体, Songti SC"> </span></p>
<br>
<p> </p>
<p><span style="font-family: 宋体, Songti SC"> </span></p>
<p><span style="font-family: 宋体, Songti SC"> </span></p><br><br>
来源:https://www.cnblogs.com/yoooos/p/16792657.html
頁:
[1]