<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none;"><!-- P {margin-top:0;margin-bottom:0;} --></style>
</head>
<body dir="ltr">
<div id="divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Helvetica,sans-serif;" dir="ltr">
<div id="divtagdefaultwrapper" style="font-size: 12pt; color: rgb(0, 0, 0); font-family: Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols;" dir="ltr">
<p>Woohoo, nested regular expressions are even easier than I thought!</p>
<p><br>
</p>
<p></p>
</div>
<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;">
<div style="font-size: 12pt; color: rgb(0, 0, 0); font-family: Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols;" dir="ltr">
<div></div>
</div>
<div>innerRegex := RxParser new parse: #(3 4 $* 5).</div>
<div>innerMatcher := RxParser preferredMatcherClass for: innerRegex.</div>
<div>regex := RxParser new parse: {#(1 2). innerMatcher. ${.$,.$3.$}. #(6 7)}.</div>
<div>matcher := RxParser preferredMatcherClass for: regex.</div>
<div><br>
</div>
<div>matcher matches: #((1 2) (3 4 5) (6 7)). "true"</div>
<div>matcher matches: #((1 2) (3 4 5) (3 5) (6 7)). "true"</div>
<div>matcher matches: #((1 2) (3 4 5) (3 5) (3 4 4 5) (6 7)). "true"</div>
<div>matcher matches: #((1 2) (3 4 5) (3 5) (3 4 4 5) (3 5) (6 7)). "false"</div>
<div>matcher matches: #((1 2) (3 4 5) (3 2 5) (3 4 4 5) (6 7)). "false"</div>
<div style="font-size: 12pt; color: rgb(0, 0, 0); font-family: Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols;" dir="ltr">
<div></div>
</div>
</blockquote>
<div style="font-size: 12pt; color: rgb(0, 0, 0); font-family: Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols;" dir="ltr">
<br>
<p></p>
<p>I'll share my changeset upon request. This is really exciting stuff.</p>
<div id="Signature">
<div id="divtagdefaultwrapper" dir="ltr" style="font-size: 12pt; color: rgb(0, 0, 0); font-family: Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols;">
<div name="divtagdefaultwrapper" style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:; margin:0">
<div>
<div class="_rp_T4" id="Item.MessagePartBody">
<div class="_rp_U4 ms-font-weight-regular ms-font-color-neutralDark rpHighlightAllClass rpHighlightBodyClass" id="Item.MessageUniqueBody" style="font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont">
<div dir="ltr">
<div id="divtagdefaultwrapper"><font face="Calibri,Helvetica,sans-serif,EmojiFont,Apple Color Emoji,Segoe UI Emoji,NotoColorEmoji,Segoe UI Symbol,Android Emoji,EmojiSymbols">
<div id="Signature">
<div style="margin:0px"><font style="font-family:Calibri,Arial,Helvetica,sans-serif,serif,EmojiFont"></font></div>
</div>
</font></div>
</div>
</div>
</div>
</div>
<div><font size="2" color="#808080"></font></div>
</div>
</div>
</div>
<div style="font-size: 12pt; color: rgb(0, 0, 0); font-family: Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols;" dir="ltr">
<br>
</div>
Best,</div>
<div style="font-size: 12pt; color: rgb(0, 0, 0); font-family: Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols;" dir="ltr">
Christoph<br>
<br>
<div style="color: rgb(0, 0, 0);">
<hr tabindex="-1" style="display:inline-block; width:98%">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" color="#000000" style="font-size:11pt"><b>Von:</b> Squeak-dev <squeak-dev-bounces@lists.squeakfoundation.org> im Auftrag von Thiede, Christoph<br>
<b>Gesendet:</b> Mittwoch, 7. April 2021 19:37 Uhr<br>
<b>An:</b> Squeak Dev<br>
<b>Betreff:</b> [squeak-dev] Regular Expressions are not limited to Strings</font>
<div> </div>
</div>
<div>
<div id="divtagdefaultwrapper" dir="ltr" style="font-size: 12pt; color: rgb(0, 0, 0); font-family: Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols;">
<p>Hi all,</p>
<p><br>
</p>
<p>just a small goody for all those interested: It turns out that, thanks to the great polymorphy in Squeak, regular expressions (as implemented in the Regex package of Trunk originally developed by <span>Vassili Bykov)</span> are not limited to collections
 that are actually strings. Here is a short counter-example:</p>
<p><br>
</p>
<blockquote style="margin:0 0 0 40px; border:none; padding:0px">
<p></p>
<div>regex := RxParser new parse: #(1 2 $+ 1).</div>
<p></p>
<p></p>
<div>matcher := RxParser preferredMatcherClass for: regex.</div>
<p></p>
<p></p>
<div>matcher matches: #(1 2 2 2 1). "true!"</div>
<p></p>
</blockquote>
<p><br>
</p>
<p>To make the example work, only a small number of hard-coded class names have to be adjusted, see the attached changeset, it's really tiny.</p>
<p><br>
</p>
<p>Here's another example:</p>
<p><br>
</p>
<blockquote style="margin:0 0 0 40px; border:none; padding:0px">
<p><span>matcher copy: #(1 2 2 1 0 1 2 1) translatingMatchesUsing: [:match | match negated]. "#(-1 -2 -2 -1 0 -1 -2 -1)"</span></p>
</blockquote>
<p><span><br>
</span></p>
<p><span>This also allows us to style texts using regexes:</span></p>
<p><span><br>
</span></p>
<blockquote style="margin:0 0 0 40px; border:none; padding:0px">
<p><span></span></p>
<div>matcher := 'ab+a' asRegex.</div>
<p></p>
<p><span></span></p>
<div>matcher copy: ' aa-aba-abba ' asText translatingMatchesUsing: [:match | match allBold]. "<span> aa-<b>aba</b>-<b>abba</b> "</span></div>
<p></p>
</blockquote>
<p><span><br>
</span></p>
<p><span>However, if the original text attributes should be preserved, we would need to hack TextStream >> #<span>withAttributes:do: into the copy methods, analogously to Text >> #format:. I guess this limitation could only be resolved by redesigning Text as
 a collection of TextCharacters, which might be very slow.</span></span></p>
<p><span><span><br>
</span></span></p>
<p><span><span>Nevertheless, I think this insight opens great possibilities for other forms of parsing. Maybe one could also process binary streams using polymorphic regex patterns, or even process sequences of domain-specific objects. Because <span>RxsPredicate
 is so generic, you could also simply define custom predicates for these objects. Later, the next step could be adding support for nested collections (RxsNested?) so that you could parse entire trees of objects ... Ah, so beautiful dreams :-)</span></span></span></p>
<p><span><span><span><br>
</span></span></span></p>
<p><span><span><span>Best,</span></span></span></p>
<p><span><span><span>Christoph</span></span></span></p>
<div id="Signature">
<div id="divtagdefaultwrapper" dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<div name="divtagdefaultwrapper" style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:; margin:0">
<div><font size="2" color="#808080"></font></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>