diff options
Diffstat (limited to 'Master/Reference Architectures and Patterns/hjp5/html/k100115.html')
| -rw-r--r-- | Master/Reference Architectures and Patterns/hjp5/html/k100115.html | 406 |
1 files changed, 406 insertions, 0 deletions
diff --git a/Master/Reference Architectures and Patterns/hjp5/html/k100115.html b/Master/Reference Architectures and Patterns/hjp5/html/k100115.html new file mode 100644 index 0000000..a527abb --- /dev/null +++ b/Master/Reference Architectures and Patterns/hjp5/html/k100115.html @@ -0,0 +1,406 @@ +<html>
+<head>
+<title>
+Handbuch der Java-Programmierung, 5. Auflage
+</title>
+</head>
+<body>
+<a name="startofbody"></a>
+<script language="JavaScript" src="hjp4lib.js">
+</script>
+<script language="JavaScript">
+installKbdHandler("97,#startofbody;101,#endofbody;116,cover.html;122,k100003.html;115,search.html;105,index.html;100,JDKDOCS;112,APIDOCS;104,k100114.html;106,k100114.html;107,k100116.html;108,k100120.html");
+</script>
+<table border=0 cellpadding=0 cellspacing=1 width="100%">
+<tr bgcolor="#EEFFCC">
+<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html"> Titel </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html"> Inhalt </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html"> Suchen </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html"> Index </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()"> DOC </a>
+<td align="right">Handbuch der Java-Programmierung, 5. Auflage
+<tr bgcolor="#EEFFCC">
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100114.html"> << </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100114.html"> < </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100116.html"> > </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100120.html"> >> </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()"> API </a>
+<td align="right">Kapitel 17 - Utility-Klassen II
+</table>
+<hr>
+
+
+<!-- Section -->
+<a name="sectionregex"></a>
+<h2>17.1 <a name="ixa101142">Reguläre Ausdrücke</a></h2>
+<hr>
+<ul>
+<li><a href="k100115.html#sectionregex">17.1 Reguläre Ausdrücke</a>
+<ul>
+<li><a href="k100115.html#sectlevel3id017001001">17.1.1 Die Klasse Pattern</a>
+<li><a href="k100115.html#sectlevel3id017001002">17.1.2 Die Klasse Matcher</a>
+<li><a href="k100115.html#sectlevel3id017001003">17.1.3 Vergleich einer Zeichenkette mit einem regulären Ausdruck</a>
+<li><a href="k100115.html#sectlevel3id017001004">17.1.4 Teilen einer Zeichenkette mit einem regulären Ausdruck</a>
+</ul>
+</ul>
+<hr>
+
+<p>
+Seit der Version 1.4 enthält das JDK auch Klassen zur Verwendung
+von regulären Ausdrücken. Dabei handelt es sich um Muster,
+die Mengen von Zeichenketten beschreiben und stellvertretend für
+diese stehen.
+
+<p>
+Wenn Sie schon einmal die Datei-Suchfunktionalität Ihres Betriebssystems
+verwendet haben, haben Sie wahrscheinlich - ohne es zu bemerken -
+einen regulären Ausdruck verwendet. Um beispielsweise alle Dateien
+in einem Ordner aufzulisten, suchen Sie typischerweise mit dem Muster
+<font color="#000077"><tt>*.*</tt></font>. Dabei steht der Stern stellvertretend
+für eine beliebige Zeichenkette und schon haben Sie einen (wenn
+auch recht einfachen) regulären Ausdruck verwendet, um nicht
+jeden Dateinamen einzeln hinschreiben zu müssen.
+
+<!-- Section -->
+
+<a name="sectlevel3id017001001"></a>
+<h3>17.1.1 Die Klasse <a name="ixa101143">Pattern</a></h3>
+
+<p>
+Um einen regulären Ausdruck zu erzeugen, hält das JDK die
+Klasse <font color="#000077"><tt>Pattern</tt></font> im Package <font color="#000077"><tt>java.util.regex</tt></font>
+bereit. So ist <font color="#000077"><tt>a*b</tt></font> beispielsweise
+ein <font color="#000077"><tt>Pattern</tt></font> zur Beschreibung
+der Zeichenketten <font color="#000077"><tt>b</tt></font>, <font color="#000077"><tt>ab</tt></font>,
+<font color="#000077"><tt>aab</tt></font> und so weiter. Wobei der
+Stern - wie allgemein üblich - für eine beliebige Menge
+von Zeichen steht. Der obige Ausdruck ließt sich also: »Eine
+beliebige Anzahl von kleinen <font color="#000077"><tt>a</tt></font>s,
+gefolgt von einem <font color="#000077"><tt>b</tt></font>«.
+
+<p>
+Die folgende Tabelle zeigt einige häufig verwendete Platzhalter.
+Die Möglichkeiten regulärer Ausdrücke in Java sind
+dabei so vielfältig, dass Sie allein ein ganzes Kapitel füllen
+würden. Eine vollständige Liste findet man z.B. in den JavaDocs
+zur Klasse <font color="#000077"><tt>Pattern</tt></font>. <a name="tableid017001"></a>
+
+<p>
+<table cols=2 border width=66%>
+
+<tr>
+<td valign=top align=left width=20%><b>Symbol</b></td>
+<td valign=top align=left width=80%><b>Bedeutung</b></td></tr>
+<tr>
+<td valign=top align=left>.</td>
+<td valign=top align=left>Ein beliebiges einzelnes Zeichen</td></tr>
+<tr>
+<td valign=top align=left>*</td>
+<td valign=top align=left>Eine beliebige Menge von Zeichen</td></tr>
+<tr>
+<td valign=top align=left>\d</td>
+<td valign=top align=left>Eine Zahl zwischen 0 und 9</td></tr>
+<tr>
+<td valign=top align=left>\D</td>
+<td valign=top align=left>Ein Zeichen das keine Zahl darstellt.</td></tr>
+<tr>
+<td valign=top align=left>\s</td>
+<td valign=top align=left>Ein beliebiges Leerzeichen (Whitespace)</td></tr>
+<tr>
+<td valign=top align=left>\S</td>
+<td valign=top align=left>Ein Zeichen, das kein Leerzeichen ist</td></tr>
+</table>
+<p><i>
+Tabelle 17.1: Häufige Elemente für reguläre Ausdrücke
+in Java</i></p>
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100%>
+<tr>
+<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=1></td>
+<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top width=1000>
+
+<p>
+Achten Sie bei der Programmierung von regulären Ausdrücken
+darauf, dass das Baskslash-Zeichen (<font color="#000077"><tt>\</tt></font>)
+in Strings reserviert ist und durch einen doppelten Backslash (<font color="#000077"><tt>\\</tt></font>)
+kodiert werden muss.</td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top>
+<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#CC0000">
+<tr>
+<td><font color="#FFFFFF"> Warnung </font></td>
+</tr>
+</table>
+</td>
+<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
+</tr>
+</table>
+
+
+<!-- Section -->
+<a name="sectlevel3id017001002"></a>
+<h3>17.1.2 Die Klasse <a name="ixa101144">Matcher</a></h3>
+
+<p>
+Während die Klasse <font color="#000077"><tt>Pattern</tt></font>
+einen regulären Ausdruck repräsentiert, können Sie
+mit Hilfe der Methode <a href="index_m.html#ixb100873"><font color=#000080><tt>matcher</tt></font></a>
+ein <font color="#000077"><tt>Matcher</tt></font>-Objekt erzeugen,
+das verwendet werden kann, um eine beliebige Zeichenkette auf den
+regulären Ausdruck zu testen.
+
+<p>
+Die Klassen für Pattern und Matcher sind dabei getrennt worden,
+da erstere auf der einen Seite relativ komplexe Objekte sind, auf
+der anderen allerdings auch threadsafe programmiert sind und in nebenläufigen
+Programmen von verschiedenen Threads gemeinsam genutzt werden können.
+<font color="#000077"><tt>Matcher</tt></font> auf der anderen Seite
+sind leichtgewichtige Objekte, die nur von einem Thread verwendet
+werden sollten. In einem Satz: Sie können jeden benötigten
+Ausdruck durch ein global zu verwendendes <font color="#000077"><tt>Pattern</tt></font>
+beschreiben und von diesem bei Bedarf beliebig viele <font color="#000077"><tt>Matcher</tt></font>-Objekte
+erzeugen lassen.
+
+<!-- Section -->
+
+<a name="sectlevel3id017001003"></a>
+<h3>17.1.3 Vergleich einer Zeichenkette mit einem regulären Ausdruck</h3>
+
+<p>
+Neben der Möglichkeit, Zeichenketten untereinander auf (partielle)
+Gleichheit zu überprüfen, wie es in <a href="k100072.html#vergleichzeichenketten">Abschnitt 11.2.4</a>
+beschrieben wird, kann mit Hilfe von regulären Ausdrücken
+auch überprüft werden, ob eine Zeichenkette von einem Ausdruck
+beschrieben wird. Hierzu erzeugt man zunächst ein Pattern-Objekt,
+das den Ausdruck repräsentiert und anschließend ein <font color="#000077"><tt>Matcher</tt></font>-Objekt,
+das zum Testen verwendet werden kann. Das folgende Listing verdeutlicht
+dies:
+<a name="listingid017001"></a>
+
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
+<tr>
+<td valign=top>
+<font color="#000055">
+<pre>
+<font color="#555555">001 </font><font color="#00AA00">/* Listing1701.java */</font>
+<font color="#555555">002 </font>
+<font color="#555555">003 </font><font color="#0000AA">import</font> java.util.regex.*;
+<font color="#555555">004 </font>
+<font color="#555555">005 </font><font color="#0000AA">public</font> <font color="#0000AA">class</font> Listing1701
+<font color="#555555">006 </font>{
+<font color="#555555">007 </font> <font color="#0000AA">public</font> <font color="#0000AA">static</font> <font color="#006699">void</font> main(String[] args)
+<font color="#555555">008 </font> {
+<font color="#555555">009 </font> <font color="#00AA00">// Erzeugen eines Pattern-Objektes für den Ausdruck a*b</font>
+<font color="#555555">010 </font> Pattern p = Pattern.compile(<font color="#0000FF">"a*b"</font>);
+<font color="#555555">011 </font>
+<font color="#555555">012 </font> <font color="#00AA00">// Erzeugen eines Matcher-Objektes für die Zeichenkette</font>
+<font color="#555555">013 </font> Matcher m = p.matcher(<font color="#0000FF">"aaaaab"</font>);
+<font color="#555555">014 </font>
+<font color="#555555">015 </font> <font color="#00AA00">// Test, ob die Zeichenkette vom Ausdruck beschrieben wird</font>
+<font color="#555555">016 </font> <font color="#006699">boolean</font> b = m.matches();
+<font color="#555555">017 </font> }
+<font color="#555555">018 </font>}</pre>
+</font>
+</td>
+<td valign=top align=right>
+<a href="../examples/Listing1701.java"><font color="#000055" size=-1>Listing1701.java</font></a></td>
+</tr>
+</table>
+<i>
+Listing 17.1: Reguläre Ausdrücke</i></p>
+
+<p>
+Auffällig an diesem Listing ist, dass weder <font color="#000077"><tt>Pattern</tt></font>
+noch <font color="#000077"><tt>Matcher</tt></font> über einen
+Konstruktor erzeugt werden. Stattdessen verwenden wir die statische
+Methode <font color="#000077"><tt>compile</tt></font>, die ein Pattern-
+Objekt zurück gibt und die Methode <font color="#000077"><tt>matcher</tt></font>,
+um einen <font color="#000077"><tt>Matcher</tt></font> zu erzeugen.
+Der Grund liegt möglicherweise darin, dass das JDK die Pattern
+auf diese Weise intern cachen kann und auch bei der »zweiten«
+Kompilierung das gleiche Objekt zurückgibt - aber verlassen Sie
+sich nicht darauf.
+
+<p>
+Wie bereits weiter oben beschrieben lassen sich einmal erzeugte Pattern
+für viele Matcher wiederverwenden und helfen so, wertvolle Ressourcen
+zu sparen. Um nur eine einzige Zeichenkette auf ein Pattern zu testen,
+kann man aber auch die folgende Kurzform verwenden:
+<a name="listingid017002"></a>
+
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
+<tr>
+<td valign=top>
+<font color="#000055">
+<pre>
+<font color="#555555">001 </font><font color="#00AA00">/* Listing1702.java */</font>
+<font color="#555555">002 </font>
+<font color="#555555">003 </font><font color="#0000AA">import</font> java.util.regex.*;
+<font color="#555555">004 </font>
+<font color="#555555">005 </font><font color="#0000AA">public</font> <font color="#0000AA">class</font> Listing1702
+<font color="#555555">006 </font>{
+<font color="#555555">007 </font> <font color="#0000AA">public</font> <font color="#0000AA">static</font> <font color="#006699">void</font> main(String[] args)
+<font color="#555555">008 </font> {
+<font color="#555555">009 </font> <font color="#00AA00">// Testet die Zeichenkette auf das Pattern</font>
+<font color="#555555">010 </font> <font color="#006699">boolean</font> b = Pattern.matches(<font color="#0000FF">"a*b"</font>, <font color="#0000FF">"aaaaab"</font>);
+<font color="#555555">011 </font> }
+<font color="#555555">012 </font>}</pre>
+</font>
+</td>
+<td valign=top align=right>
+<a href="../examples/Listing1702.java"><font color="#000055" size=-1>Listing1702.java</font></a></td>
+</tr>
+</table>
+<i>
+Listing 17.2: Kurzer Zeichenketten-Vergleich mit regulären Ausdrücken</i></p>
+
+<p>
+Bei dieser Kurzversion wird das Pattern intern kompiliert, anschließend
+ein passender Matcher erzeugt und schließlich nur das Resultat
+zurückgegeben. Dieser »Einzeiler« ist zwar markant,
+allerdings lässt sich das Pattern nicht wiederverwenden.
+
+<p>
+Und es geht sogar noch kürzer und ohne explizite Verwendung der
+Klassen im Package <font color="#000077"><tt>java.util.regex</tt></font>,
+wie es das folgende Listing demonstriert. Seit dem JDK 5 stellt die
+Klasse <font color="#000077"><tt>String</tt></font> nämlich die
+Methode <font color="#000077"><tt>matches</tt></font> zur Verfügung,
+hinter der sich nichts anderes als oben beschriebene Kurzform verbirgt.
+<a name="listingid017003"></a>
+
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
+<tr>
+<td valign=top>
+<font color="#000055">
+<pre>
+<font color="#555555">001 </font><font color="#00AA00">/* Listing1703.java */</font>
+<font color="#555555">002 </font>
+<font color="#555555">003 </font><font color="#0000AA">public</font> <font color="#0000AA">class</font> Listing1703
+<font color="#555555">004 </font>{
+<font color="#555555">005 </font> <font color="#0000AA">public</font> <font color="#0000AA">static</font> <font color="#006699">void</font> main(String[] args)
+<font color="#555555">006 </font> {
+<font color="#555555">007 </font> <font color="#00AA00">// Testet die Zeichenkette auf das Pattern</font>
+<font color="#555555">008 </font> <font color="#006699">boolean</font> b = <font color="#0000FF">"aaaaab"</font>.matches(<font color="#0000FF">"a*b"</font>);
+<font color="#555555">009 </font> }
+<font color="#555555">010 </font>}</pre>
+</font>
+</td>
+<td valign=top align=right>
+<a href="../examples/Listing1703.java"><font color="#000055" size=-1>Listing1703.java</font></a></td>
+</tr>
+</table>
+<i>
+Listing 17.3: Strings und reguläre Ausdrücke</i></p>
+
+
+<!-- Section -->
+<a name="sectlevel3id017001004"></a>
+<h3>17.1.4 Teilen einer Zeichenkette mit einem regulären Ausdruck</h3>
+
+<p>
+Neben dem Test auf Äquivalenz erlauben es reguläre Ausdrücke
+auch, Teile einer Zeichenkette zu ersetzen oder lange Zeichenketten
+in mehrere Teile aufzuspalten (engl. <i>Splitting</i>). Für letzteres
+besitzt die Klasse <font color="#000077"><tt>Pattern</tt></font> die
+Methoden <a href="index_s.html#ixb100540"><font color=#000080><tt>split</tt></font></a>
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
+<tr>
+<td valign=top width=100%>
+<font color="#660066">
+<pre>
+public String[] split(CharSequence input)
+
+public String[] split(CharSequence input, int limit)
+</pre>
+</font>
+</td>
+<td valign=top>
+<a href="../jdkdocs/api/java/util/regex/Pattern.html" onClick="this.href=getApiDoc('java.util.regex.Pattern')"><font color="#660066" size=-1>java.util.regex.Pattern</font></a></td>
+</tr>
+</table>
+
+<p>
+Mit Hilfe des zweiten Parameters kann dabei angegeben werden, in wieviele
+Teile die Zeichenkette maximal aufgeteilt werden soll. Er ist eine
+Obergrenze für die Größe des zurückgegebenen
+Arrays. Wird als Limit eine negative Zahl angeben, wird die Zeichenkette
+beliebig oft durch das Pattern geteilt. Beide Methoden verhalten sich
+dann identisch.
+
+<p>
+Das folgende Listing zeigt das Splitting der Zeichenkette, die uns
+schon im Kapitel über Strings begegnet ist:
+<a name="listingid017004"></a>
+
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
+<tr>
+<td valign=top>
+<font color="#000055">
+<pre>
+<font color="#555555">001 </font><font color="#00AA00">/* Listing1704.java */</font>
+<font color="#555555">002 </font>
+<font color="#555555">003 </font><font color="#0000AA">import</font> java.util.regex.*;
+<font color="#555555">004 </font>
+<font color="#555555">005 </font><font color="#0000AA">public</font> <font color="#0000AA">class</font> Listing1704
+<font color="#555555">006 </font>{
+<font color="#555555">007 </font> <font color="#0000AA">public</font> <font color="#0000AA">static</font> <font color="#006699">void</font> main(String[] args)
+<font color="#555555">008 </font> {
+<font color="#555555">009 </font> <font color="#00AA00">// Der zu verwendende Testsatz</font>
+<font color="#555555">010 </font> String satz = <font color="#0000FF">"Dies ist nur ein Test"</font>;
+<font color="#555555">011 </font>
+<font color="#555555">012 </font> <font color="#00AA00">// Jedes Whitespace-Zeichen soll zur </font>
+<font color="#555555">013 </font> <font color="#00AA00">// Trennung verwendet werden</font>
+<font color="#555555">014 </font> Pattern p = Pattern.compile(<font color="#0000FF">"\\s"</font>);
+<font color="#555555">015 </font>
+<font color="#555555">016 </font> <font color="#00AA00">// Verwendung der Methode split</font>
+<font color="#555555">017 </font> String[] result = p.split(satz);
+<font color="#555555">018 </font> <font color="#0000AA">for</font> (<font color="#006699">int</font> x=0; x<result.length; x++) {
+<font color="#555555">019 </font> System.out.println(result[x]);
+<font color="#555555">020 </font> }
+<font color="#555555">021 </font> }
+<font color="#555555">022 </font>}</pre>
+</font>
+</td>
+<td valign=top align=right>
+<a href="../examples/Listing1704.java"><font color="#000055" size=-1>Listing1704.java</font></a></td>
+</tr>
+</table>
+<i>
+Listing 17.4: Zerlegen von Zeichenketten</i></p>
+
+<p>
+Soll das Pattern nicht wiederverwendet werden, kann man auch in diesem
+Fall auf eine äquivalente Methode der Klasse <font color="#000077"><tt>String</tt></font>
+zurückgreifen, wie bereits in <a href="k100072.html#stringzerlegen">Abschnitt 11.2.7</a>
+beschrieben.
+<hr>
+<table border=0 cellpadding=0 cellspacing=1 width="100%">
+<tr bgcolor="#EEFFCC">
+<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html"> Titel </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html"> Inhalt </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html"> Suchen </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html"> Index </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()"> DOC </a>
+<td align="right">Handbuch der Java-Programmierung, 5. Auflage, Addison
+Wesley, Version 5.0.1
+<tr bgcolor="#EEFFCC">
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100114.html"> << </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100114.html"> < </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100116.html"> > </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100120.html"> >> </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()"> API </a>
+<td align="right">© 1998, 2007 Guido Krüger & Thomas
+Stark, <a href="http://www.javabuch.de">http://www.javabuch.de</a>
+</table>
+<a name="endofbody"></a>
+</body>
+</html>
|
