飞飞龙女 發表於 2022-9-19 10:17:44

grep正则表达式匹配中括号的方法实例

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">1. 匹配中括号,例如匹配 String[] args</a></li><li><a href="#_label1">2. 匹配大括号,例如匹配 {abc 123}</a></li><li><a href="#_label2">3. 同时匹配中括号和大括号,例如匹配 new byte[]{6, 55, 73, 72, 0, 0x60, 0x77}</a></li><li><a href="#_label3">4. 总结</a></li><li><a href="#_label4">5. 参考</a></li><li><a href="#_label5">总结</a></li></ul></div><p class="maodian"><a name="_label0"></a></p><h2>1. 匹配中括号,例如匹配 String[] args</h2>
<div class="jb51code"><pre class="brush:php;">$ echo "String[] args" | grep -Eo "[]+"
String[] args                (这一行是匹配到的结果)
</pre></div>
<p>(1)<code>grep -E</code> 加上 <code>-E</code> 表示采用正则表达式进行匹配。加 <code>-o</code> 参数,表示只输出匹配到的部分。</p>
<p>(2)正则表达式中,表示 Character class (字符组)的中括号:即下面例子中最外层的中括号,例如 <code>+</code> 匹配一个或多个 0 到 9 的数字,<code>+</code> 匹配一个或多个 0 到 9、小 a 到 小 z 的字符。</p>
<p>(3)在字符组中使用中括号,也就是说在中括号里还有中括号。 <strong>匹配中括号 <code>[</code> <code>]</code>时,需要把中括号放到字符组的最前面,且<code>]</code> 在前,<code>[</code>在后。</strong>(如下面例子中的 <code>[]+</code>)</p>
<p><code>echo &quot;String[] args&quot; | grep -E &quot;[[]0-9a-zA-Z ]+&quot;</code> 这样是不匹配 <code>String[] args</code> 的。</p>
<p>用 <code>[</code> 可以匹配到左中括号,例如,这种形式 <code>+</code> 可以匹配到左中括号,无法匹配右中括号:</p>
<div class="jb51code"><pre class="brush:php;">$ echo "String[] args" | grep -Eo "+"
String[                (这一行是匹配到的结果)
args                (这一行是匹配到的结果)
</pre></div>
<p>说明:加 <code>-o</code> 参数,表示只输出匹配到的部分。可以看到只匹配到了 <code>String[</code>,没有右中括号。</p>
<p>其他情况的输出结果:</p>
<div class="jb51code"><pre class="brush:php;">$ echo "String[] args" | grep -Eo "]+"
[]                (这一行是匹配到的结果)
</pre></div>
<p>说明:这个正则表达式 <code>]+</code> 实际被解释为 <code></code> 和 <code>]+</code> 了。<code></code> 匹配左中括号,接着是 <code>]+</code> 匹配右中括号。</p>
<div class="jb51code"><pre class="brush:php;">$ echo "String[] args" | grep -Eo "[]0-9a-zA-Z []+"String[] args(这一行是匹配到的结果)$ echo "String[] args" | grep -Eo "[]0-9a-zA-Z []+"
String[] args                (这一行是匹配到的结果)
</pre></div>
<p>说明:<code>[]0-9a-zA-Z []+</code> 是可以匹配 <code>String[] args</code> 的,需要把 <code>]</code> 放到最前面。<code>[</code> 放到后面也可以。</p>
<p><strong>注意:一定要加 <code>-o</code> 参数。</strong></p>
<p class="maodian"><a name="_label1"></a></p><h2>2. 匹配大括号,例如匹配 {abc 123}</h2>
<p><strong>大括号 <code>{<!-- --></code> <code>}</code> 在中括号中没有顺序关系。也不用必须放在中括号的最前面。</strong></p>
<p>这几种形式都可以: <code>[}{0-9a-zA-Z ]+</code>, <code>[{}0-9a-zA-Z ]+</code>,<code>+</code>,<code>+</code></p>
<div class="jb51code"><pre class="brush:php;">$ echo "{abc 123}" | grep -Eo "[}{0-9a-zA-Z ]+"
{abc 123}                (这一行是匹配的结果)

$ echo "{abc 123}" | grep -Eo "[{}0-9a-zA-Z ]+"
{abc 123}                (这一行是匹配的结果)
</pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>3. 同时匹配中括号和大括号,例如匹配 new byte[]{6, 55, 73, 72, 0, 0x60, 0x77}</h2>
<p><code>[][}{0-9a-zA-Z, ]+</code> ,<code>[][{}0-9a-zA-Z, ]+</code>,<code>[]}{0-9a-zA-Z[, ]+</code>,<code>[]}{0-9a-zA-Z, []+</code>,<code>[]0-9a-zA-Z[, {}]+</code>,<code>[]0-9a-zA-Z, {}[]+</code> 都可以。</p>
<p>中括号中的 <code>]</code> 在前,<code>[</code>在后,即 <code>][</code></p>
<p>大括号 <code>{<!-- --></code> <code>}</code>先后没有关系。</p>
<div class="jb51code"><pre class="brush:php;">$ echo "new byte[]{6, 55, 73, 72, 0, 0x60, 0x77}" | grep -Eo "[][}{0-9a-zA-Z, ]+"
new byte[]{6, 55, 73, 72, 0, 0x60, 0x77}                (这一行是匹配的结果)

$ echo "new byte[]{6, 55, 73, 72, 0, 0x60, 0x77}" | grep -Eo "[][{}0-9a-zA-Z, ]+"
new byte[]{6, 55, 73, 72, 0, 0x60, 0x77}                (这一行是匹配的结果)

$ echo "new byte[]{6, 55, 73, 72, 0, 0x60, 0x77}" | grep -Eo "[]}{0-9a-zA-Z[, ]+"
new byte[]{6, 55, 73, 72, 0, 0x60, 0x77}
</pre></div>
<p class="maodian"><a name="_label3"></a></p><h2>4. 总结</h2>
<p>(1)匹配字符组中的中括号时(中括号里的中括号),<code>]</code> 需要在最前面,<code>[</code> 的位置可以放在中间或者最后面。</p>
<p>(2)用 <code>[</code> 或者 <code>[[</code> 都可以匹配左中括号。</p>
<p>(3)匹配字符组中的大括号,此时大括号没有特殊含义,所以 <code>{<!-- --></code> <code>}</code>的位置可以随意一些(但不要破坏其他区间)。</p>
<p class="maodian"><a name="_label4"></a></p><h2>5. 参考</h2>
<p>https://stackoverflow.com/questions/30044199/how-can-i-match-square-bracket-in-regex-with-grep</p>
<blockquote><p>[&hellip;] If a bracket expression specifies both &lsquo;-&rsquo; and &lsquo;]&rsquo;, the &lsquo;]&rsquo; shall be placed first (after the &lsquo;^&rsquo;, if any) and the &lsquo;-&rsquo; last within the bracket expression.<br />Therefore, your regex should be:<br /><code>echo &quot;fdsl[]&quot; | grep -Eo &quot;[][ a-z]+&quot;</code></p></blockquote>
<p class="maodian"><a name="_label5"></a></p><h2>总结</h2>
頁: [1]
查看完整版本: grep正则表达式匹配中括号的方法实例