<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Boost.Regex: Subexpression mehrfach auswerten]]></title><description><![CDATA[<p>Hallo zusammen,<br />
Ich befasse mich gerade ein wenig mit Boost.Regex. Dazu habe ich schon einige Beispiele programmiert, nun habe ich zu einem Thema eine Frage.</p>
<p>Es ist ja möglich, die per <code>(</code> und <code>)</code> markierten Teilausdrücke (marked subexpressions) in <code>match_results</code> auszulesen. Ich habe dazu ein einfaches Beispiel geschrieben, das einen simplen Satz erkennen soll:</p>
<pre><code class="language-cpp">std::string str = &quot;Das ist ein einfacher Satz.&quot;;
boost::regex expr(&quot;((\\w+) )*(\\w+)\\.&quot;);
boost::smatch what;
boost::regex_match(str, what, expr);
</code></pre>
<p>Wie kann ich nun die einzelnen Wörter aus <code>what</code> auslesen? Die eingeklammerten Ausdrücke <code>\\w+</code> führen ja nur zu jeweils einem Element im Resultat. Also wie kann ich den <code>regex_match</code> -Container dazu bringen, in jedem Element (natürlich ausser dem ersten) jeweils ein Wort zu speichern?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/230353/boost-regex-subexpression-mehrfach-auswerten</link><generator>RSS for Node</generator><lastBuildDate>Sun, 27 Sep 2026 07:59:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/230353.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 25 Dec 2008 00:51:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Boost.Regex: Subexpression mehrfach auswerten on Thu, 25 Dec 2008 00:51:16 GMT]]></title><description><![CDATA[<p>Hallo zusammen,<br />
Ich befasse mich gerade ein wenig mit Boost.Regex. Dazu habe ich schon einige Beispiele programmiert, nun habe ich zu einem Thema eine Frage.</p>
<p>Es ist ja möglich, die per <code>(</code> und <code>)</code> markierten Teilausdrücke (marked subexpressions) in <code>match_results</code> auszulesen. Ich habe dazu ein einfaches Beispiel geschrieben, das einen simplen Satz erkennen soll:</p>
<pre><code class="language-cpp">std::string str = &quot;Das ist ein einfacher Satz.&quot;;
boost::regex expr(&quot;((\\w+) )*(\\w+)\\.&quot;);
boost::smatch what;
boost::regex_match(str, what, expr);
</code></pre>
<p>Wie kann ich nun die einzelnen Wörter aus <code>what</code> auslesen? Die eingeklammerten Ausdrücke <code>\\w+</code> führen ja nur zu jeweils einem Element im Resultat. Also wie kann ich den <code>regex_match</code> -Container dazu bringen, in jedem Element (natürlich ausser dem ersten) jeweils ein Wort zu speichern?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1635154</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1635154</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 25 Dec 2008 00:51:16 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.Regex: Subexpression mehrfach auswerten on Thu, 25 Dec 2008 01:57:42 GMT]]></title><description><![CDATA[<p>Ich glaube dies ist nicht vorhanden, zumindest nicht per default:<br />
<a href="http://www.boost.org/doc/libs/1_37_0/libs/regex/doc/html/boost_regex/captures.html" rel="nofollow">http://www.boost.org/doc/libs/1_37_0/libs/regex/doc/html/boost_regex/captures.html</a></p>
<p>Allerdings würde ich dein Beispiel auch anders lösen:</p>
<pre><code class="language-cpp">#include &lt;boost/regex.hpp&gt;

#include &lt;iostream&gt;

int main()
{
	std::string str = &quot;Das ist ein einfacher Satz.&quot;;
	boost::regex expr(&quot;\\w+&quot;);

	boost::sregex_iterator iter(str.begin(), str.end(), expr);
	boost::sregex_iterator end;

	for(; iter != end; ++iter)
	{ std::cout &lt;&lt; *iter &lt;&lt; std::endl; }

	return 0;
}
</code></pre>
<p>Allerdings verliert man dadurch natürlich die Möglichkeit zu prüfen, ob es sich wirklich um einen Satz handelt.<br />
Insofern ist wohl beides zugleich nicht möglich.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1635165</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1635165</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Thu, 25 Dec 2008 01:57:42 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.Regex: Subexpression mehrfach auswerten on Thu, 25 Dec 2008 23:38:19 GMT]]></title><description><![CDATA[<p>Vielen Dank, mit <code>regex_iterator</code> habe ich mich gar noch nicht gross auseinandergesetzt, ich wollte zuerst das Grundlegende verstehen. Die Captures sehen auch interessant aus... Wie meinst du &quot;nicht per default vorhanden&quot;?</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>Insofern ist wohl beides zugleich nicht möglich.</p>
</blockquote>
<p>Ist ja nicht so schlimm, das aufzutrennen. Genau genommen sind das ja auch zwei Aufgaben. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Jetzt habe ich gerade noch eine Frage zu Boost.Regex:<br />
Wie funktioniert der Lookahead (Operator <code>?=</code> ) genau? Aus der kurzen Beschreibung der Dokumentation wurde ich nicht wirklich schlau...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1635588</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1635588</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 25 Dec 2008 23:38:19 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.Regex: Subexpression mehrfach auswerten on Fri, 26 Dec 2008 00:35:09 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Wie meinst du &quot;nicht per default vorhanden&quot;?</p>
</blockquote>
<p>Nach dieser Aussage folgt ein Doppelpunkt und dann ein Link. Den Artikel dort drin mal durchlesen, vor allem den Bereich &quot;Repeated Captures&quot;. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Jetzt habe ich gerade noch eine Frage zu Boost.Regex:<br />
Wie funktioniert der Lookahead (Operator <code>?=</code> ) genau? Aus der kurzen Beschreibung der Dokumentation wurde ich nicht wirklich schlau...</p>
</blockquote>
<p>Ich bin mich nicht ganz sicher, ob ich es absolut richtig verstanden habe und es richtig rüberbringen kann. Aber grundsätzlich sind es Bedingungen, wie es in der Beschreibung steht, welche man per AND verkünpfen kann.</p>
<p>Es ist ja dieses Beispiel gegeben:</p>
<pre><code>(?=.*&lsqb;&lsqb;:lower:&rsqb;&rsqb;)(?=.*&lsqb;&lsqb;:upper:&rsqb;&rsqb;)(?=.*&lsqb;&lsqb;:punct:&rsqb;&rsqb;).{6,}
</code></pre>
<p>Grundsätzlich muss man sich hier einige Dinge vor Augen führen:</p>
<ol>
<li><code>(?=.*&lsqb;&lsqb;:lower:&rsqb;&rsqb;)</code> , <code>(?=.*&lsqb;&lsqb;:upper:&rsqb;&rsqb;)</code> und <code>(?=.*&lsqb;&lsqb;:punct:&rsqb;&rsqb;)</code> verspeisen alle keine Zeichen. Das sind reine logische Anweisungen, welche aber keine Zeichen verbrauchen. Es steht ja auch &quot;consumes zero characters&quot;.</li>
<li><code>.{6,}</code> ist also eigentlich der &quot;normale&quot; reguläre Ausdruck.</li>
</ol>
<p>Dadurch sollte es wohl klar werden. Das davor sind nur Anweisungen, wie der reguläre Ausdruck aufgebaut sein muss. Es sind logische If-Abfragen. Der String, welcher aus mindestens 6 Zeichen besteht, muss also das folgende in auch dieser Reihenfolge erfüllen:<br />
1. Beliebige Anzahl Zeichen, gefolgt von einem Kleinbuchstaben.<br />
2. Beliebige Anzahl Zeichen, gefolgt von einem Grossbuchstaben.<br />
3. Beliebige Anzahl Zeichen, gefolgt von einem Satzzeichen.</p>
<p>Nur wenn die 6 oder mehr Zeichen diese 3 Bedingungen in derselben Reihenfolge erfüllen, dann ist es ein Treffer.</p>
<p>Ist das verständlich? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1635612</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1635612</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 26 Dec 2008 00:35:09 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.Regex: Subexpression mehrfach auswerten on Sat, 27 Dec 2008 16:03:22 GMT]]></title><description><![CDATA[<p>Vielen Dank.</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>Nur wenn die 6 oder mehr Zeichen diese 3 Bedingungen <strong>in derselben Reihenfolge</strong> erfüllen, dann ist es ein Treffer.</p>
</blockquote>
<p>Beim Boost-Beispiel steht aber nichts von der Reihenfolge... Ist es denn irgendwie möglich, die Reihenfolge ausser Acht zu lassen? Also dass die einzige Bedingung darin besteht, mindestens einen Klein-, einen Grossbuchstaben und ein Interpunktionszeichen zu enthalten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1636168</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1636168</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 27 Dec 2008 16:03:22 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.Regex: Subexpression mehrfach auswerten on Sat, 27 Dec 2008 16:13:55 GMT]]></title><description><![CDATA[<p>Ich denke, dass das mit regex_search geht. regex_match verlangt ja immer, dass der ganze Ausdruck stimmt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1636176</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1636176</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 27 Dec 2008 16:13:55 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.Regex: Subexpression mehrfach auswerten on Sat, 27 Dec 2008 16:58:39 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Beim Boost-Beispiel steht aber nichts von der Reihenfolge... Ist es denn irgendwie möglich, die Reihenfolge ausser Acht zu lassen? Also dass die einzige Bedingung darin besteht, mindestens einen Klein-, einen Grossbuchstaben und ein Interpunktionszeichen zu enthalten?</p>
</blockquote>
<p>Hab es schnell getestet und musste feststellen, dass es von der Reihenfolge unabhängig ist. Anscheinend sind nur die nicht logischen Ausdrücke von der Reihenfolge abhängig. Was mich zwar ein wenig verwundert. Also:</p>
<pre><code>A(?=.*&lsqb;&lsqb;:lower:&rsqb;&rsqb;)(?=.*&lsqb;&lsqb;:upper:&rsqb;&rsqb;)(?=.*&lsqb;&lsqb;:punct:&rsqb;&rsqb;).{6,}
</code></pre>
<p>Jetzt müsste jeder Ausdruck mit einem A starten und danach folgen die 6 Zeichen, bestehend aus mindestens einem Satzzeichen, einem Kleinbuchstaben und einem Grossbuchstaben. In welcher Reihenfolge Satzzeichen, Kleinbuchstaben und Grossbuchstaben kommen, spielt keine Rolle, sie müssen einfach nach dem A vorkommen.</p>
<p>Dadurch widersprechen aber die logischen Ausdrücke irgendwie der restlichen Syntax, wo die Reihenfolge eine wesentliche Rolle spielt. Und wie man dann erreichen kann, dass die Reihenfolge eingehalten werden soll, entgeht mir jetzt.</p>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1636191</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1636191</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 27 Dec 2008 16:58:39 GMT</pubDate></item></channel></rss>