154 lines
9.3 KiB
HTML
154 lines
9.3 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<title>YBlog - replace all except some part</title>
|
||
<meta name="keywords" content="ruby, regexp, regular expression" />
|
||
|
||
<link rel="shortcut icon" type="image/x-icon" href="../../../../Scratch/img/favicon.ico" />
|
||
<link rel="stylesheet" type="text/css" href="/css/y.css" />
|
||
<link rel="stylesheet" type="text/css" href="/css/legacy.css" />
|
||
<link rel="alternate" type="application/rss+xml" title="RSS" href="/rss.xml" />
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<link rel="apple-touch-icon" href="../../../../Scratch/img/about/FlatAvatar@2x.png" />
|
||
<!--[if lt IE 9]>
|
||
<script src="http://ie7-js.googlecode.com/svn/version/2.1(beta4)/IE9.js"></script>
|
||
<![endif]-->
|
||
<!-- IndieAuth -->
|
||
<link href="https://ieji.de/@yogsototh" rel="me">
|
||
<link href="https://github.com/yogsototh" rel="me">
|
||
<link href="mailto:yann.esposito@gmail.com" rel="me">
|
||
<link rel="pgpkey" href="../../../../pubkey.txt">
|
||
</head>
|
||
<body lang="en" class="article">
|
||
<div id="content">
|
||
<div id="header">
|
||
<div id="choix">
|
||
<span id="choixlang">
|
||
<a href="../../../../Scratch/fr/blog/2009-09-replace-all-except-some-part/">French</a>
|
||
</span>
|
||
<span class="tomenu"><a href="#navigation">↓ Menu ↓</a></span>
|
||
<span class="flush"></span>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="titre">
|
||
<h1>replace all except some part</h1>
|
||
|
||
</div>
|
||
<div class="flush"></div>
|
||
<div id="afterheader" class="article">
|
||
<div class="corps">
|
||
<p>My problem is simple:</p>
|
||
<p>I want to filter a text except some part of it. I can match easily the part I don’t want to be filtered. For example</p>
|
||
<div>
|
||
<div class="sourceCode" id="cb1"><pre class="sourceCode html"><code class="sourceCode html"><a class="sourceLine" id="cb1-1" title="1">...</a>
|
||
<a class="sourceLine" id="cb1-2" title="2">text</a>
|
||
<a class="sourceLine" id="cb1-3" title="3">...</a>
|
||
<a class="sourceLine" id="cb1-4" title="4">BEGIN not to filter</a>
|
||
<a class="sourceLine" id="cb1-5" title="5">...</a>
|
||
<a class="sourceLine" id="cb1-6" title="6">text</a>
|
||
<a class="sourceLine" id="cb1-7" title="7">...</a>
|
||
<a class="sourceLine" id="cb1-8" title="8">END not to filter</a>
|
||
<a class="sourceLine" id="cb1-9" title="9">...</a>
|
||
<a class="sourceLine" id="cb1-10" title="10">text</a>
|
||
<a class="sourceLine" id="cb1-11" title="11">...</a></code></pre></div>
|
||
</div>
|
||
<p>I searched a better way to do that, but the best I can do is using <code>split</code> and <code>scan</code>.</p>
|
||
<div>
|
||
<div class="sourceCode" id="cb2"><pre class="sourceCode ruby"><code class="sourceCode ruby"><a class="sourceLine" id="cb2-1" title="1"><span class="kw">def</span> allExceptCode( f, content )</a>
|
||
<a class="sourceLine" id="cb2-2" title="2"> <span class="co"># Beware the behaviour will change if you add</span></a>
|
||
<a class="sourceLine" id="cb2-3" title="3"> <span class="co"># parenthesis (groups) to the regexp!</span></a>
|
||
<a class="sourceLine" id="cb2-4" title="4"> regexp=<span class="ot">/<code[^>]*>.*?<\/code>|<pre[^>]*>.*?<\/pre>/m</span></a>
|
||
<a class="sourceLine" id="cb2-5" title="5"> tmp=<span class="st">""</span></a>
|
||
<a class="sourceLine" id="cb2-6" title="6"> mem=[]</a>
|
||
<a class="sourceLine" id="cb2-7" title="7"> content.scan(regexp).each <span class="kw">do</span> |c|</a>
|
||
<a class="sourceLine" id="cb2-8" title="8"> mem <<= c</a>
|
||
<a class="sourceLine" id="cb2-9" title="9"> <span class="kw">end</span></a>
|
||
<a class="sourceLine" id="cb2-10" title="10"> i=<span class="dv">0</span></a>
|
||
<a class="sourceLine" id="cb2-11" title="11"> content.split(regexp).each <span class="kw">do</span> |x|</a>
|
||
<a class="sourceLine" id="cb2-12" title="12"> tmp <<= send(f,x) </a>
|
||
<a class="sourceLine" id="cb2-13" title="13"> <span class="kw">if</span> <span class="kw">not</span> mem[i].nil? </a>
|
||
<a class="sourceLine" id="cb2-14" title="14"> tmp <<= mem[i]</a>
|
||
<a class="sourceLine" id="cb2-15" title="15"> i+=<span class="dv">1</span></a>
|
||
<a class="sourceLine" id="cb2-16" title="16"> <span class="kw">end</span></a>
|
||
<a class="sourceLine" id="cb2-17" title="17"> <span class="kw">end</span></a>
|
||
<a class="sourceLine" id="cb2-18" title="18"> tmp</a>
|
||
<a class="sourceLine" id="cb2-19" title="19"><span class="kw">end</span></a></code></pre></div>
|
||
</div>
|
||
<p>An usage is:</p>
|
||
<div>
|
||
<div class="sourceCode" id="cb3"><pre class="sourceCode ruby"><code class="sourceCode ruby"><a class="sourceLine" id="cb3-1" title="1"><span class="kw">def</span> filter(content)</a>
|
||
<a class="sourceLine" id="cb3-2" title="2"> content.gsub(<span class="ot">/e/</span>,<span class="ch">'X'</span>)</a>
|
||
<a class="sourceLine" id="cb3-3" title="3"><span class="kw">end</span></a>
|
||
<a class="sourceLine" id="cb3-4" title="4">...</a>
|
||
<a class="sourceLine" id="cb3-5" title="5">allExceptCode(<span class="st">:filter</span>, content)</a>
|
||
<a class="sourceLine" id="cb3-6" title="6">...</a></code></pre></div>
|
||
</div>
|
||
<p>A better syntax would be:</p>
|
||
<div>
|
||
<div class="sourceCode" id="cb4"><pre class="sourceCode ruby"><code class="sourceCode ruby"><a class="sourceLine" id="cb4-1" title="1"><span class="co"># !!!!!!!!!! THIS SYNTAX DOES NOT WORK !!!!!!! #</span></a>
|
||
<a class="sourceLine" id="cb4-2" title="2"><span class="kw">def</span> allExceptCode( f, content )</a>
|
||
<a class="sourceLine" id="cb4-3" title="3"> regexp=<span class="ot">/<code[^>]*>.*?<\/code>/m</span></a>
|
||
<a class="sourceLine" id="cb4-4" title="4"> tmp=<span class="st">""</span></a>
|
||
<a class="sourceLine" id="cb4-5" title="5"> content.split(regexp).each <span class="kw">do</span> |x|</a>
|
||
<a class="sourceLine" id="cb4-6" title="6"> separator=<span class="dt">$&</span></a>
|
||
<a class="sourceLine" id="cb4-7" title="7"> tmp <<= send(f,x) </a>
|
||
<a class="sourceLine" id="cb4-8" title="8"> <span class="kw">if</span> <span class="kw">not</span> separator.nil?</a>
|
||
<a class="sourceLine" id="cb4-9" title="9"> tmp <<= separator</a>
|
||
<a class="sourceLine" id="cb4-10" title="10"> <span class="kw">end</span></a>
|
||
<a class="sourceLine" id="cb4-11" title="11"> <span class="kw">end</span></a>
|
||
<a class="sourceLine" id="cb4-12" title="12"> tmp</a>
|
||
<a class="sourceLine" id="cb4-13" title="13"><span class="kw">end</span></a></code></pre></div>
|
||
</div>
|
||
<p>I would expect the split make a search on a regular expression and then give the matched expression into the <code>$&</code> variable. But it is not the case.</p>
|
||
<p>If someone know a nicer way to do that I will be happy to know how.</p>
|
||
</div>
|
||
<div id="afterarticle">
|
||
<div id="social">
|
||
<a href="/rss.xml" target="_blank" rel="noopener noreferrer nofollow" class="social">RSS</a>
|
||
·
|
||
<a href="https://twitter.com/home?status=http%3A%2F%2Fyannesposito.com/Scratch/en/blog/2009-09-replace-all-except-some-part/%20via%20@yogsototh" target="_blank" rel="noopener noreferrer nofollow" class="social">Tweet</a>
|
||
·
|
||
<a href="http://www.facebook.com/sharer/sharer.php?u=http%3A%2F%2Fyannesposito.com/Scratch/en/blog/2009-09-replace-all-except-some-part/" target="_blank" rel="noopener noreferrer nofollow" class="social">FB</a>
|
||
<br />
|
||
<a class="message" href="../../../../Scratch/en/blog/Social-link-the-right-way/">These social sharing links preserve your privacy</a>
|
||
</div>
|
||
<div id="navigation">
|
||
<a href="../../../../">Home</a>
|
||
<span class="sep">¦</span>
|
||
<a href="../../../../Scratch/en/blog">Blog</a>
|
||
<span class="sep">¦</span>
|
||
<a href="../../../../Scratch/en/softwares">Softwares</a>
|
||
<span class="sep">¦</span>
|
||
<a href="/about-me.html">About</a>
|
||
</div>
|
||
<div id="totop"><a href="#header">↑ Top ↑</a></div>
|
||
<div id="bottom">
|
||
<div>
|
||
Published on 2009-09-22
|
||
</div>
|
||
<div>
|
||
<a href="https://ieji.de/@yogsototh">Follow @yogsototh@ieji.de</a>
|
||
</div>
|
||
<div>
|
||
<a rel="license" href="http://creativecommons.org/licenses/by/3.0/deed.en_US">Yann Esposito©</a>
|
||
</div>
|
||
|
||
<div>
|
||
Done with
|
||
<a href="http://www.vim.org" target="_blank" rel="noopener noreferrer nofollow"><strike>Vim</strike></a>
|
||
<a href="http://spacemacs.org" target="_blank" rel="noopener noreferrer nofollow">spacemacs</a>
|
||
<span class="pala">&</span>
|
||
<a href="http://nanoc.ws" target="_blank" rel="noopener noreferrer nofollow"><strike>nanoc</strike></a>
|
||
<a href="http://jaspervdj.be/hakyll" target="_blank" rel="noopener noreferrer nofollow">Hakyll</a>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
</div>
|
||
</body>
|
||
</html>
|