Gray Soft / Deadly Regular Expressions / Regex Code Equivalency
tag:graysoftinc.com,2014-03-20:/posts/132
2014-09-25T22:13:07Z
James Edward Gray II
The 2nd Comment on "Regex Code Equivalency"
tag:graysoftinc.com,2014-09-25:/comments/561
2014-09-25T22:13:07Z
I would say the `String` methods are probably preferable in most cases.
<p>I would say the <code>String</code> methods are probably preferable in most cases.</p>
James Edward Gray II
The 1st Comment on "Regex Code Equivalency"
tag:graysoftinc.com,2014-09-25:/comments/560
2014-09-25T22:13:07Z
Benchmarking these would be pretty interesting. Still, I'm pretty sure String's native methods are all superior to regexes, performance-wise.
<p>Benchmarking these would be pretty interesting. Still, I'm pretty sure String's native methods are all superior to regexes, performance-wise.</p>
Guilherme Simões
Regex Code Equivalency
tag:graysoftinc.com,2014-09-25:/posts/132
2014-09-25T22:13:07Z
Firing up the regular expression engine to do what could be accomplished with a simple == check has been called, "clubbing someone to death with a loaded Uzi." What are the other places where we can replace a regex with some code or vice versa?
<div class="highlight highlight-ruby"><pre><span class="c1">#!/usr/bin/env ruby -w</span>
<span class="no">Name</span> <span class="o">=</span> <span class="s2">"Gray, James"</span>
<span class="o">!!</span><span class="p">(</span><span class="no">Name</span> <span class="o">=~</span> <span class="sr">/\AGray/</span><span class="p">)</span> <span class="c1"># => true</span>
<span class="no">Name</span><span class="o">.</span><span class="n">start_with?</span><span class="p">(</span><span class="s2">"Gray"</span><span class="p">)</span> <span class="c1"># => true</span>
<span class="o">!!</span><span class="p">(</span><span class="no">Name</span> <span class="o">=~</span> <span class="sr">/James\z/</span><span class="p">)</span> <span class="c1"># => true</span>
<span class="no">Name</span><span class="o">.</span><span class="n">end_with?</span><span class="p">(</span><span class="s2">"James"</span><span class="p">)</span> <span class="c1"># => true</span>
<span class="o">!!</span><span class="p">(</span><span class="no">Name</span> <span class="o">=~</span> <span class="sr">/Dana/</span><span class="p">)</span> <span class="c1"># => false</span>
<span class="no">Name</span><span class="o">.</span><span class="n">include?</span><span class="p">(</span><span class="s2">"Dana"</span><span class="p">)</span> <span class="c1"># => false</span>
<span class="o">!!</span><span class="p">(</span><span class="no">Name</span> <span class="o">=~</span> <span class="sr">/\A\z/</span><span class="p">)</span> <span class="c1"># => false</span>
<span class="no">Name</span><span class="o">.</span><span class="n">empty?</span> <span class="c1"># => false</span>
<span class="o">!!</span><span class="p">(</span><span class="no">Name</span> <span class="o">=~</span> <span class="sr">/\AGray, James\z/</span><span class="p">)</span> <span class="c1"># => true</span>
<span class="no">Name</span> <span class="o">==</span> <span class="s2">"Gray, James"</span> <span class="c1"># => true</span>
<span class="o">!!</span><span class="p">(</span><span class="no">Name</span> <span class="o">=~</span> <span class="sr">/\A(?:Gray, James|Gray, Dana)\z/</span><span class="p">)</span> <span class="c1"># => true</span>
<span class="o">[</span><span class="s2">"Gray, James"</span><span class="p">,</span> <span class="s2">"Gray, Dana"</span><span class="o">].</span><span class="n">include?</span><span class="p">(</span><span class="no">Name</span><span class="p">)</span> <span class="c1"># => true</span>
<span class="no">Name</span> <span class="o">=~</span> <span class="sr">/\A\w+/</span> <span class="o">&&</span> <span class="vg">$&</span> <span class="c1"># => "Gray"</span>
<span class="no">Name</span><span class="o">[</span><span class="sr">/\A\w+/</span><span class="o">]</span> <span class="c1"># => "Gray"</span>
<span class="no">Name</span> <span class="o">=~</span> <span class="sr">/\A(\w+),\s*(\w+)\z/</span> <span class="o">&&</span> <span class="vg">$2</span> <span class="c1"># => "James"</span>
<span class="no">Name</span><span class="o">[</span><span class="sr">/\A(\w+),\s*(\w+)\z/</span><span class="p">,</span> <span class="mi">2</span><span class="o">]</span> <span class="c1"># => "James"</span>
<span class="no">Name</span> <span class="o">=~</span> <span class="sr">/\A(?<last>\w+),\s*(?<first>\w+)\z/</span> <span class="o">&&</span> <span class="vg">$~</span><span class="o">[</span><span class="ss">:first</span><span class="o">]</span> <span class="c1"># => "James"</span>
<span class="no">Name</span><span class="o">[</span><span class="sr">/\A(?<last>\w+),\s*(?<first>\w+)\z/</span><span class="p">,</span> <span class="ss">:first</span><span class="o">]</span> <span class="c1"># => "James"</span>
<span class="no">Name</span><span class="o">.</span><span class="n">scan</span><span class="p">(</span><span class="sr">/^.*\n?/</span><span class="p">)</span> <span class="c1"># => ["Gray, James"]</span>
<span class="no">Name</span><span class="o">.</span><span class="n">lines</span> <span class="c1"># => ["Gray, James"]</span>
<span class="no">Name</span><span class="o">.</span><span class="n">scan</span><span class="p">(</span><span class="sr">/./m</span><span class="p">)</span> <span class="c1"># => ["G", "r", "a", "y", ",", " ", "J", "a", "m", "e", "s"]</span>
<span class="no">Name</span><span class="o">.</span><span class="n">chars</span> <span class="c1"># => ["G", "r", "a", "y", ",", " ", "J", "a", "m", "e", "s"]</span>
<span class="no">Name</span><span class="o">.</span><span class="n">gsub</span><span class="p">(</span><span class="sr">/[aeiou]/</span><span class="p">,</span> <span class="s2">""</span><span class="p">)</span> <span class="c1"># => "Gry, Jms"</span>
<span class="no">Name</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span><span class="s2">"aeiou"</span><span class="p">)</span> <span class="c1"># => "Gry, Jms"</span>
<span class="no">Name</span><span class="o">.</span><span class="n">gsub</span><span class="p">(</span><span class="sr">/[aeiou]/</span><span class="p">,</span> <span class="s2">"X"</span><span class="p">)</span> <span class="c1"># => "GrXy, JXmXs"</span>
<span class="no">Name</span><span class="o">.</span><span class="n">tr</span><span class="p">(</span><span class="s2">"aeiou"</span><span class="p">,</span> <span class="s2">"X"</span><span class="p">)</span> <span class="c1"># => "GrXy, JXmXs"</span>
<span class="c1"># For the destructive operations that follow you can drop the `dup()` and</span>
<span class="c1"># switch `sub()` to `sub!()`, as long as you don't care about the return value.</span>
<span class="no">Name</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sr">/(?=,)/</span><span class="p">,</span> <span class="s2">" II"</span><span class="p">)</span> <span class="c1"># => "Gray II, James"</span>
<span class="no">Name</span><span class="o">.</span><span class="n">dup</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="no">Name</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="s2">","</span><span class="p">),</span> <span class="s2">" II"</span><span class="p">)</span> <span class="c1"># => "Gray II, James"</span>
<span class="no">Name</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sr">/\A/</span><span class="p">,</span> <span class="s2">"Name: "</span><span class="p">)</span> <span class="c1"># => "Name: Gray, James"</span>
<span class="no">Name</span><span class="o">.</span><span class="n">dup</span><span class="o">.</span><span class="n">prepend</span><span class="p">(</span><span class="s2">"Name: "</span><span class="p">)</span> <span class="c1"># => "Name: Gray, James"</span>
<span class="no">Name</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sr">/\A.*\z/m</span><span class="p">,</span> <span class="s2">"Gray, Dana"</span><span class="p">)</span> <span class="c1"># => "Gray, Dana"</span>
<span class="no">Name</span><span class="o">.</span><span class="n">dup</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">"Gray, Dana"</span><span class="p">)</span> <span class="c1"># => "Gray, Dana"</span>
<span class="no">Name</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sr">/\A.*\z/m</span><span class="p">,</span> <span class="s2">""</span><span class="p">)</span> <span class="c1"># => ""</span>
<span class="no">Name</span><span class="o">.</span><span class="n">dup</span><span class="o">.</span><span class="n">clear</span> <span class="c1"># => ""</span>
<span class="no">Spacey</span> <span class="o">=</span> <span class="s2">"</span><span class="se">\t</span><span class="s2">some space</span><span class="se">\r\n</span><span class="s2">"</span>
<span class="no">Spacey</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sr">/\A\s+/</span><span class="p">,</span> <span class="s2">""</span><span class="p">)</span> <span class="c1"># => "some space\r\n"</span>
<span class="no">Spacey</span><span class="o">.</span><span class="n">lstrip</span> <span class="c1"># => "some space\r\n"</span>
<span class="no">Spacey</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sr">/\s+\z/</span><span class="p">,</span> <span class="s2">""</span><span class="p">)</span> <span class="c1"># => "\tsome space"</span>
<span class="no">Spacey</span><span class="o">.</span><span class="n">rstrip</span> <span class="c1"># => "\tsome space"</span>
<span class="no">Spacey</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sr">/\A\s*(.+?)\s*\z/m</span><span class="p">,</span> <span class="s1">'\1'</span><span class="p">)</span> <span class="c1"># => "some space"</span>
<span class="no">Spacey</span><span class="o">.</span><span class="n">strip</span> <span class="c1"># => "some space"</span>
<span class="no">Spacey</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sr">/(?:\r?\n|\r)\z/m</span><span class="p">,</span> <span class="s2">""</span><span class="p">)</span> <span class="c1"># => "\tsome space"</span>
<span class="no">Spacey</span><span class="o">.</span><span class="n">chomp</span> <span class="c1"># => "\tsome space"</span>
<span class="no">Spacey</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sr">/(?:\r\n|.)\z/m</span><span class="p">,</span> <span class="s2">""</span><span class="p">)</span> <span class="c1"># => "\tsome space"</span>
<span class="no">Spacey</span><span class="o">.</span><span class="n">chop</span> <span class="c1"># => "\tsome space"</span>
<span class="no">Spacey</span><span class="o">.</span><span class="n">gsub</span><span class="p">(</span><span class="sr">/ +/</span><span class="p">,</span> <span class="s2">" "</span><span class="p">)</span> <span class="c1"># => "\tsome space\r\n"</span>
<span class="no">Spacey</span><span class="o">.</span><span class="n">squeeze</span><span class="p">(</span><span class="s2">" "</span><span class="p">)</span> <span class="c1"># => "\tsome space\r\n"</span>
</pre></div>
James Edward Gray II