255 lines
19 KiB
HTML
255 lines
19 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="zh" dir="ltr" class="client-nojs" xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh">
|
|
<head><meta http-equiv="x-ua-compatible" content="ie=edge">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
<title>正则表达式库</title>
|
|
<link rel="stylesheet" href="ext.css" />
|
|
<link rel="stylesheet" href="site_modules.css" />
|
|
</head>
|
|
<body class="mediawiki ltr sitedir-ltr ns-0 ns-subject page-cpp_regex skin-cppreference2 action-view cpp-navbar">
|
|
<div id="cpp-content-base">
|
|
<div id="content"><a id="top"></a>
|
|
<h1 id="firstHeading" class="firstHeading">正则表达式库</h1>
|
|
<div id="bodyContent">
|
|
<div id="contentSub"><span class="subpages">< <a href="cpp.html">cpp</a></span></div>
|
|
<div id="mw-content-text" lang="zh" dir="ltr" class="mw-content-ltr" xml:lang="zh">
|
|
<p>正则表达式库提供表示<a href="https://en.wikipedia.org/wiki/Regular_expression" class="extiw" title="enwiki:Regular expression">正则表达式</a>的类,正则表达式是一种用于在字符串中匹配模式的微型语言。下列数种对象上的操作能刻画几乎所有带正则表达式的操作:</p>
|
|
<ul>
|
|
<li><b>目标序列</b>。为模式而搜索到的字符序列。这可以是二个迭代器所指定的范围、空终止字符串或一个 <span class="t-lc"><a href="cpp-string-basic_string.html">std::string</a></span> 。</li>
|
|
</ul>
|
|
<ul>
|
|
<li><b>模式</b>。这是正则表达式自身。它确定构成匹配者。它是从带特定语法的字符串构成的 <span class="t-lc"><a href="cpp-regex-basic_regex.html">std::basic_regex</a></span> 类型对象。受支持的语法变体的描述见 <a href="cpp-regex-syntax_option_type.html">syntax_option_type</a> 。</li>
|
|
</ul>
|
|
<ul>
|
|
<li><b>匹配的数组</b>。关于匹配的信息可作为 <span class="t-lc"><a href="cpp-regex-match_results.html">std::match_results</a></span> 类型对象获取。</li>
|
|
</ul>
|
|
<ul>
|
|
<li><b>替换字符串</b>。这是确定如何替换匹配的字符串,受支持的语法变体的描述见 <a href="cpp-regex-match_flag_type.html">match_flag_type</a> 。</li>
|
|
</ul>
|
|
<h3><span class="mw-headline" id=".E4.B8.BB.E7.B1.BB">主类</span></h3>
|
|
<p>这些类封装正则表达式和在字符的目标序列中匹配正则表达式的结果。</p>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-regex-basic_regex.html"><span class="t-lines"><span>basic_regex</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>正则表达式对象<br />
|
|
<span class="t-mark">(类模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-regex-sub_match.html"><span class="t-lines"><span>sub_match</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>标识子表达式所匹配的字符序列<br />
|
|
<span class="t-mark">(类模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-regex-match_results.html"><span class="t-lines"><span>match_results</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>标识一个正则表达式匹配,包含所有子表达式匹配<br />
|
|
<span class="t-mark">(类模板)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E7.AE.97.E6.B3.95">算法</span></h3>
|
|
<p>这些算法将封装于 regex 的正则表达式应用到字符的目标序列。</p>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-regex-regex_match.html"><span class="t-lines"><span>regex_match</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>尝试匹配一个正则表达式到整个字符序列<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-regex-regex_search.html"><span class="t-lines"><span>regex_search</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>尝试匹配一个正则表达式到字符序列的任何部分<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-regex-regex_replace.html"><span class="t-lines"><span>regex_replace</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>以格式化的替换文本来替换正则表达式匹配的出现位置<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E8.BF.AD.E4.BB.A3.E5.99.A8">迭代器</span></h3>
|
|
<p>regex_iterator 用于遍历在序列中找到的匹配正则表达式的整个集合。</p>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-regex-regex_iterator.html"><span class="t-lines"><span>regex_iterator</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>迭代一个字符序列中的所有正则表达式匹配<br />
|
|
<span class="t-mark">(类模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-regex-regex_token_iterator.html"><span class="t-lines"><span>regex_token_iterator</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>迭代给定字符串中的所有正则表达式匹配中的指定子表达式,或迭代未匹配的子字符串<br />
|
|
<span class="t-mark">(类模板)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E5.BC.82.E5.B8.B8">异常</span></h3>
|
|
<p>此类定义作为异常抛出以报告来自正则表达式库错误的类型。</p>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-regex-regex_error.html"><span class="t-lines"><span>regex_error</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>报告正则表达式库生成的错误<br />
|
|
<span class="t-mark">(类)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E7.89.B9.E5.BE.81">特征</span></h3>
|
|
<p>regex_traits 类用于封装 regex 的本地化方面。</p>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-regex-regex_traits.html"><span class="t-lines"><span>regex_traits</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>提供正则表达式库所需的关于字符类型的元信息<br />
|
|
<span class="t-mark">(类模板)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E5.B8.B8.E9.87.8F">常量</span></h3>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc-header">
|
|
<td colspan="2">
|
|
<div>定义于命名空间 <code>std::regex_constants</code></div>
|
|
</td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-regex-syntax_option_type.html"><span class="t-lines"><span>syntax_option_type</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>控制正则表达式行为的通用选项<br />
|
|
<span class="t-mark">(typedef)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-regex-match_flag_type.html"><span class="t-lines"><span>match_flag_type</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>特定于匹配的选项<br />
|
|
<span class="t-mark">(typedef)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-regex-error_type.html"><span class="t-lines"><span>error_type</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>描述不同类型的匹配错误<br />
|
|
<span class="t-mark">(typedef)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E7.A4.BA.E4.BE.8B">示例</span></h3>
|
|
<div class="t-example">
|
|
<div class="t-example-live-link"></div>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="co2">#include <iostream></span>
|
|
<span class="co2">#include <iterator></span>
|
|
<span class="co2">#include <string></span>
|
|
<span class="co2">#include <regex></span>
|
|
|
|
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
<a href="cpp-string-basic_string.html"><span class="kw1230">std::<span class="me2">string</span></span></a> s <span class="sy1">=</span> <span class="st0">"Some people, when confronted with a problem, think "</span>
|
|
<span class="st0">"<span class="es1">\"</span>I know, I'll use regular expressions.<span class="es1">\"</span> "</span>
|
|
<span class="st0">"Now they have two problems."</span><span class="sy4">;</span>
|
|
|
|
<a href="cpp-regex-basic_regex.html"><span class="kw2000">std::<span class="me2">regex</span></span></a> self_regex<span class="br0">(</span><span class="st0">"REGULAR EXPRESSIONS"</span>,
|
|
<a href="cpp-regex-syntax_option_type.html"><span class="kw2032">std::<span class="me2">regex_constants</span><span class="sy4">::</span><span class="me2">ECMAScript</span></span></a> <span class="sy3">|</span> <a href="cpp-regex-syntax_option_type.html"><span class="kw2028">std::<span class="me2">regex_constants</span><span class="sy4">::</span><span class="me2">icase</span></span></a><span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="kw1">if</span> <span class="br0">(</span><a href="cpp-regex-regex_search.html"><span class="kw2013">std::<span class="me2">regex_search</span></span></a><span class="br0">(</span>s, self_regex<span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">"Text contains the phrase 'regular expressions'<span class="es1">\n</span>"</span><span class="sy4">;</span>
|
|
<span class="br0">}</span>
|
|
|
|
<a href="cpp-regex-basic_regex.html"><span class="kw2000">std::<span class="me2">regex</span></span></a> word_regex<span class="br0">(</span><span class="st0">"(<span class="es1">\\</span>w+)"</span><span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="kw4">auto</span> words_begin <span class="sy1">=</span>
|
|
<a href="cpp-regex-regex_iterator.html"><span class="kw2018">std::<span class="me2">sregex_iterator</span></span></a><span class="br0">(</span>s.<span class="me1">begin</span><span class="br0">(</span><span class="br0">)</span>, s.<span class="me1">end</span><span class="br0">(</span><span class="br0">)</span>, word_regex<span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="kw4">auto</span> words_end <span class="sy1">=</span> <a href="cpp-regex-regex_iterator.html"><span class="kw2018">std::<span class="me2">sregex_iterator</span></span></a><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
|
|
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">"Found "</span>
|
|
<span class="sy1"><<</span> <a href="cpp-iterator-distance.html"><span class="kw673">std::<span class="me2">distance</span></span></a><span class="br0">(</span>words_begin, words_end<span class="br0">)</span>
|
|
<span class="sy1"><<</span> <span class="st0">" words<span class="es1">\n</span>"</span><span class="sy4">;</span>
|
|
|
|
<span class="kw4">const</span> <span class="kw4">int</span> N <span class="sy1">=</span> <span class="nu0">6</span><span class="sy4">;</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">"Words longer than "</span> <span class="sy1"><<</span> N <span class="sy1"><<</span> <span class="st0">" characters:<span class="es1">\n</span>"</span><span class="sy4">;</span>
|
|
<span class="kw1">for</span> <span class="br0">(</span><a href="cpp-regex-regex_iterator.html"><span class="kw2018">std::<span class="me2">sregex_iterator</span></span></a> i <span class="sy1">=</span> words_begin<span class="sy4">;</span> i <span class="sy3">!</span><span class="sy1">=</span> words_end<span class="sy4">;</span> <span class="sy2">++</span>i<span class="br0">)</span> <span class="br0">{</span>
|
|
<a href="cpp-regex-match_results.html"><span class="kw2010">std::<span class="me2">smatch</span></span></a> match <span class="sy1">=</span> <span class="sy2">*</span>i<span class="sy4">;</span>
|
|
<a href="cpp-string-basic_string.html"><span class="kw1230">std::<span class="me2">string</span></span></a> match_str <span class="sy1">=</span> match.<span class="me1">str</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="kw1">if</span> <span class="br0">(</span>match_str.<span class="me1">size</span><span class="br0">(</span><span class="br0">)</span> <span class="sy1">></span> N<span class="br0">)</span> <span class="br0">{</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">" "</span> <span class="sy1"><<</span> match_str <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
<span class="br0">}</span>
|
|
<span class="br0">}</span>
|
|
|
|
<a href="cpp-regex-basic_regex.html"><span class="kw2000">std::<span class="me2">regex</span></span></a> long_word_regex<span class="br0">(</span><span class="st0">"(<span class="es1">\\</span>w{7,})"</span><span class="br0">)</span><span class="sy4">;</span>
|
|
<a href="cpp-string-basic_string.html"><span class="kw1230">std::<span class="me2">string</span></span></a> new_s <span class="sy1">=</span> <a href="cpp-regex-regex_replace.html"><span class="kw2014">std::<span class="me2">regex_replace</span></span></a><span class="br0">(</span>s, long_word_regex, <span class="st0">"[$&]"</span><span class="br0">)</span><span class="sy4">;</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> new_s <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
<p>输出:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="text source-text">
|
|
<pre class="de1">Text contains the phrase 'regular expressions'
|
|
Found 20 words
|
|
Words longer than 6 characters:
|
|
confronted
|
|
problem
|
|
regular
|
|
expressions
|
|
problems
|
|
Some people, when [confronted] with a [problem], think
|
|
"I know, I'll use [regular] [expressions]." Now they have two [problems].</pre></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|