public static void main(String[] args) { try { final BufferedImage img = ImageIO.read(new File("images/example.jpg")); final int w = img.getWidth(); final int h = img.getHeight(); final int pixels[] = new int[w * h]; img.getRGB(0, 0, w, h, pixels, 0, w); for (int i = 0; i < pixels.length; i++) { System.out.println("R:" + ((pixels[i] >> 16) & 0xff) + " G:" + ((pixels[i] >> 8) & 0xff) + " B:" + (pixels[i] & 0xff)); } } catch (IOException e) { e.printStackTrace(); } }
Dienstag, 30. November 2010
Pixel aus BufferedImage auslesen
An die Pixel eines BufferedImage kann man ganz einfach gelangen. Den Sniplet brauchte ich vor Ewigkeiten mal und habe ihn gerade wiedergefunden. Super einfach eigentlich:
Schreibweise für String-Concatenation
Das man mal einen String zusammensetzen will, kommt ja häufig vor und ist einfach. Beispiel:
String s = "[Attribute: " + getQualifiedName() + "=\"" + value + "\"]";Daran gibt es ansich auch nicht viel zu mäkeln, außer eben, dass diese Schreibweise, je nach Länge, schnell unübersichtlich aussieht. Viel netter ist es eigentlich, den
StringBuilder
mit seiner Kettenschreibweise zu verwenden. String s = new StringBuilder() .append("[Attribute: ") .append(getQualifiedName()) .append("=\"") .append(value) .append("\"") .append("]") .toString();Wenn man nun ganz korrekt sein will, kann man außerdem abschätzen, wie groß der String werden könnte, und dem
StringBuilder
gleich die dazu passende Größe mitgeben, so dass er möglichst selten mitwachsen muss. Merklich performanter dürfte keine der beiden Lösungen sein, da der Hotspot-Compiler das String-Concatenieren ohnehin optimiert, wenn er es denn kann. Probleme hingegen gibt es da schnell mal in Schleifenkonstrukten. Ist die Logik zum String bauen umfangreicherer, empfiel sich ohnehin immer der StringBuilder
bzw. der StringBuffer
, wenn man das synchronisierte Derivat braucht, oder kein Java 1.5 zur Verfügung hat, was hoffentlich selten geworden ist.
Donnerstag, 25. November 2010
jsoup: Java HTML Parser
Das hier gehört in die Kategorie: Muss ich mir merken. Eine Java-API, die von sich behauptet, Wildbahn-HTML parsen zu können. Mit anderen Worten, dass Ding soll recht fehlertolerant sein.Zur Projektseite geht es hier: http://jsoup.org/
via Schockwellenreiter
via Schockwellenreiter
PR-Aktionen im Web 2.0 und wie man sie besser nicht umsetzt
Aral hat gerade eine Werbeaktion laufen, bei der sie jedem ein belegtes Baguettbrötchen schenken, der Fan ihrer Facebookseite wird. Das ist eine Variante von Marketing, der ich durchaus etwas abgewinnen kann. Einzig bei der Umsetzung hätte Aral wohl auf erfahrenere Entwickler zurückgreifen sollen. Anfangs funktionierte das ganz gut. Bis auch ich darauf aufmerksam wurde, war der Traffic auf die Gutscheinapp vermutlich schon in die Höhe geschnellt. Ich werde also erstmal nur von einer weißen Seite begrüßt. Ein Blick auf die Aral-Pinnwand offenbart, dass der Mob die Ankündigung mit passenden Kommentaren flutet. Im Hintergrund scheint fleißig gewerkelt zu werden und nach einiger Zeit scheint das mit dem Gutschein wieder zu klappen. Einzig ungewöhnlich ist die anschließende Meldung:
Die sieht so aus, als könne die Gutscheinnummer, die da generiert wurde, nicht in die Datenbank geschrieben werden, weil ein Constraint verletzt wurde. Wenn die Nummern, die da generiert werden, nicht im Nachhinein reproduzierbar sind, werden sicher einige Gutscheinausdrucker ihre Freude haben, wenn sie für den Gutscheincode keine Aralbemme ausgeliefert bekommen. Jedenfalls lassen sich nun beliebig viele Gutscheine mit unterschiedlichem Code generieren. Das wird wohl darauf hinauslaufen, dass entweder Aral bis Jahresende fleißig Futter rausrückt, oder der PR-Schuss nach hinten losgeht. Die Empörung ist bei der Web2.0- und vor allem der Schnäppchenmacher-Zielgruppe erfahrungsgemäß groß, wenn versprochenes nicht eingehalten wird.
Inzwischen funktioniert das ganze übrigens gar nicht mehr und man bekommt eine Sperrseite. Das dürfte wohl die Reißleine sein, die da gezogen wurde.
Und die Moral von der Geschichte? Wenn man eine Anwendung online stellt, bei der mit einer Menge Anfragen zu rechnen ist, empfiehlt sich ein Stresstest. Und wann ist mit vielen Anfragen zu rechnen? Auf jeden Fall immer dann, wenn es was kostenloses gibt.
Facbook-App von Aral,
insert into aral_coupon_user (id, coupon_id, facebook_uid, used_barcode) VALUES (785, 102, '100000112611741', '981035092500') Duplicate entry '785' for key 1
Die sieht so aus, als könne die Gutscheinnummer, die da generiert wurde, nicht in die Datenbank geschrieben werden, weil ein Constraint verletzt wurde. Wenn die Nummern, die da generiert werden, nicht im Nachhinein reproduzierbar sind, werden sicher einige Gutscheinausdrucker ihre Freude haben, wenn sie für den Gutscheincode keine Aralbemme ausgeliefert bekommen. Jedenfalls lassen sich nun beliebig viele Gutscheine mit unterschiedlichem Code generieren. Das wird wohl darauf hinauslaufen, dass entweder Aral bis Jahresende fleißig Futter rausrückt, oder der PR-Schuss nach hinten losgeht. Die Empörung ist bei der Web2.0- und vor allem der Schnäppchenmacher-Zielgruppe erfahrungsgemäß groß, wenn versprochenes nicht eingehalten wird.
Inzwischen funktioniert das ganze übrigens gar nicht mehr und man bekommt eine Sperrseite. Das dürfte wohl die Reißleine sein, die da gezogen wurde.
Und die Moral von der Geschichte? Wenn man eine Anwendung online stellt, bei der mit einer Menge Anfragen zu rechnen ist, empfiehlt sich ein Stresstest. Und wann ist mit vielen Anfragen zu rechnen? Auf jeden Fall immer dann, wenn es was kostenloses gibt.
Facbook-App von Aral,
Dienstag, 23. November 2010
Upgrade von Mint Isadora auf Julia
Heute war zeitlicher Spielraum zum Basteln. Dabei habe ich gleich mal mein Mint auf die nächste Version aktualisiert. Natürlich mittels APT-Distupgrade. Was bei Ubuntu ganz ordentlich funktioniert, ist bei Mint etwas kritischer. Das Paket für das Mint-Menü hat sich ein wenig geziert, und ich musste nachhelfen. Alles weitere hat sich von allein erledigt. Das ganze Prozedere verlief dieses Mal angenehm ereignislos.
Erster Bug nach dem Neustart: die Icons im Mint-Menü waren auf zwei Pixel zusammengeschrumpft. Das lies sich aber mit ein paar Klicks im dazugehörigen Konfigurationsdialog beheben. Etwas hakeliger war es da mit der Kalendererweiterung Lightning, für die es zwar ein Update gab, aber nicht für die X86_64 Architektur. Da hat der automatische Pluginupdater vom Thunderbird irgendwie daneben gegriffen. Aber nach ein wenig Sucharbeit war auch das schnell erledigt.
Summa Summarum ging alles recht flott. Trotzdem finde ich Rolling-Releases irgendwie netter.
Erster Bug nach dem Neustart: die Icons im Mint-Menü waren auf zwei Pixel zusammengeschrumpft. Das lies sich aber mit ein paar Klicks im dazugehörigen Konfigurationsdialog beheben. Etwas hakeliger war es da mit der Kalendererweiterung Lightning, für die es zwar ein Update gab, aber nicht für die X86_64 Architektur. Da hat der automatische Pluginupdater vom Thunderbird irgendwie daneben gegriffen. Aber nach ein wenig Sucharbeit war auch das schnell erledigt.
Summa Summarum ging alles recht flott. Trotzdem finde ich Rolling-Releases irgendwie netter.
Samstag, 20. November 2010
Ubuntu Desktop-Tuning
Als ich mal mein Home-Verzeichnis von der flotten SSD auf meine lahme, Caviar-Green umgelegt hatte, gab es einen unschönen Nebeneffekt. Nämlich der, dass Anwendungen plötzlich für mehrere Sekunden hingen. Das fand ich wenig nachvollziehbar, weil die Platte ja sooo langsam auch wieder nicht war. Ich habe die Änderung einige Zeit später wieder Rückgängig gemacht und nicht weiter darüber nachgedacht. Heute bin ich über einen Artikel gestolpert, der für einen späten AHA-Effekt sorgte.
http://everflux.de/ubuntu-desktop-tuning-mit-elevatordeadline-1681/
Mein Rechner bekommt jetzt mal diese beiden Zeilen spendiert:
*Update 23.11*
Bis dato hat sich kein Beschleunigungsgefühl einstellen wollen. Im Gegenteil hatte ich sogar wieder die Ersten Anwendungshänger seit langem. Die Zeilen fliegen wohl wieder raus.
*Update 22.12*
Zum Thema SSD-Tuning findet sich bei Zockertown noch ein interessante Beitrag.
*Update 27.03.12 *
Zum Thema SSD-Trim unter Linux aktivieren auf jeden Fall mal bei loggn.de reinschauen.
http://everflux.de/ubuntu-desktop-tuning-mit-elevatordeadline-1681/
Mein Rechner bekommt jetzt mal diese beiden Zeilen spendiert:
echo "noop" | tee /sys/block/sda/queue/scheduler
echo "deadline" | tee /sys/block/sdb/queue/scheduler
*Update 23.11*
Bis dato hat sich kein Beschleunigungsgefühl einstellen wollen. Im Gegenteil hatte ich sogar wieder die Ersten Anwendungshänger seit langem. Die Zeilen fliegen wohl wieder raus.
*Update 22.12*
Zum Thema SSD-Tuning findet sich bei Zockertown noch ein interessante Beitrag.
*Update 27.03.12 *
Zum Thema SSD-Trim unter Linux aktivieren auf jeden Fall mal bei loggn.de reinschauen.
Mittwoch, 17. November 2010
Darktheme für Eclipse
Eigentlich bin ich mit der Farbgebung der Eclipse-Editoren ganz zufrieden und habe auch nie das Bedürfnis gehabt daran etwas zu ändern. Bis ich vor kurzem über ein Textmate-Farbschema gestolpert bin, dass ich unbedingt mal ausprobieren musste. Zwar werde ich es wohl nicht in Dauergebrauch nehmen, finde es aber trotzdem eine sehr nette und vor allem angenehme Variante, die es auf jeden Fall wert ist, ausprobiert zu werden. Leider sieht der Editor anschließend wie ein Alien in der Eclipse-IDE aus, da das Farbschema der restlichen UI beim alten bleibt.
Vor dem Ausprobieren empfiehlt es sich die alte Konfiguration zu sichern. Das geschieht über den Eclipse Preference-Exportwizard im Menü File->Export. Anschließend kann man mittels File->Import den Preference-Importwizard auf das neue Colortheme loslassen.
Das Farbschema kann man bei blog.ronnyristau.de downloaden.
Vor dem Ausprobieren empfiehlt es sich die alte Konfiguration zu sichern. Das geschieht über den Eclipse Preference-Exportwizard im Menü File->Export. Anschließend kann man mittels File->Import den Preference-Importwizard auf das neue Colortheme loslassen.
Das Farbschema kann man bei blog.ronnyristau.de downloaden.
Dienstag, 16. November 2010
Web Designers vs. Web Developers
Klischees sind was schönes. Ich liebe sie. Es ist zwar eigentlich jedem klar, dass die nie komplett passen und die Ausnahme die Regel ist, aber man fühlt sich immer so schön bestätigt, wenn mal wieder eines passt. Ich kenne die Zusammenarbeit mit Grafikdesignern gut. Ich bin immer ausgezeichnet mit ihnen ausgekommen. Interessant wird es aber immer dann, wenn ein Kompromiss gefunden werden will, weil die Idee des Designers technisch nicht oder nur mit Klimmzügen realisierbar ist. Ich hatte auch schon Diskussionen, weil der Entwurf nicht pixelgleich unter IE und Firefox umgesetzt werden konnte.
Der hier deckt zwar bei weitem nicht alles ab, ist aber irgendwie passend:

Web Designers vs Web Developers is brought to you by Wix.com
You are most welcome to share this infographic with your audience.
via sixrevisions
Der hier deckt zwar bei weitem nicht alles ab, ist aber irgendwie passend:

Web Designers vs Web Developers is brought to you by Wix.com
You are most welcome to share this infographic with your audience.
via sixrevisions
Montag, 15. November 2010
Kostenlose SciFi
Der Chiphersteller Intel ist ja durchaus dafür bekannt, dass er die Marketingklaviatur hervorragend beherrscht. Das Buch "Über morgen" gehört, wie ich finde, zu einer sehr netten PR-Aktion. Bekannte Autoren schreiben Kurzgeschichten und Intel gibt noch Links zu den, im weitesten Sinne, behandelten Intel-Technologien dazu. Außerdem noch ein paar Seiten Unternehmensinformationen zum Abschluss. Alles in allem eine coole Aktion, bei der der Nutzwert für den Leser definitiv passt.
Das Buch gibt es als Podcast zum hören, sowie im EPUB- und PDF-Format im Intel newsroom.
via lesen.net
Das Buch gibt es als Podcast zum hören, sowie im EPUB- und PDF-Format im Intel newsroom.
via lesen.net
Samstag, 13. November 2010
Flash Mob Gone Wrong by Tom Scott
“The whole world turns upside down in ten years, but you turn upside down with it.” - Spider Robinson, 1977
Das ist natürlich alles Fiktion. Die einzelnen Bestandteile befinden sich aber verdächtig nahe an der Realität, so dass nur zu sagen bleibt: Möglich wäre es.
Das ist natürlich alles Fiktion. Die einzelnen Bestandteile befinden sich aber verdächtig nahe an der Realität, so dass nur zu sagen bleibt: Möglich wäre es.
Donnerstag, 11. November 2010
Buchempfehlung - Aus dem Tagebuch eines Bughunters
Ich hatte neulich die Gelegenheit etwas Zeit beim Fachbuchhändler Lehmanns in der IT-Ecke zu verbringen. Ich war überrascht, wie nett es dort inzwischen geworden ist. Es gibt Leseecken und Kaffee und man kann sich voller Muße und in aller Ruhe umsehen. Ich hatte einige interessante Bücher in der Hand, wovon mich aber eines im Nachhinein besonders angesprochen hat. Natürlich ein Fachbuch, aber mal eines, das man ganz locker lesen kann. Das Buch erzählt über die Arbeit und das Vorgehen eines Bughunters, über seine Werkzeuge und natürlich werden die verschiedenen Sicherheitslücken beleuchtet, die Software so enthalten kann. Das Buch ist unterhaltsam und lehrreich zugleich. Für Softwareentwickler unbedingt empfehlenswert, nicht etwa, weil es die coole Techniken beschreibt, die man vielleicht für das nächste Projekt nutzen könnte, sondern viel mehr das Verständnis für das tägliche Tun fördert. Das ganze ist natürlich etwas C-Lastig, aber auch für Java- und Scriptprogrammierer verständlich.
Aus dem Tagebuch eines Bughunters - Wie man Software-Schwachstellen aufspürt und behebt
Aus dem Tagebuch eines Bughunters - Wie man Software-Schwachstellen aufspürt und behebt
E-Mailadresse validieren nach RFC822 mal anders
Und zwar mittels regulärem Ausdruck. Reguläre Ausdrücke gehören im Javabiotop nicht unbedingt zur Best Practice, in PHP und Perl trifft man sie aber häufiger. Einer der Gründe wird wohl mit der oft schlechten Lesbar- und Wartbarkeit zusammenhängen. Wer das richtig beherrscht, der kann da aber einiges mit zaubern. Ein Beispiel hierfür ist ein Ausdruck für die Validierung von E-Mailadressen gemäß RFC822. Ein wahres Monster! Die Java-Pattern-Api scheint aber gut damit zurechtzukommen (Im Gegensatz zum Syntaxhighlighter, deshalb gibt es den Code heute in Plain).
String regexp = "(?:(?:\\r\\n)?[ \\t])*(?:(?:(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[\\t]))*\"(?:(?:\\r\\n)?[ \\t])*))*@(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*|(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)*\\<(?:(?:\\r\\n)?[ \\t])*(?:@(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[\\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*(?:,@(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[\\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*)*:(?:(?:\\r\\n)?[ \\t])*)?(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*))*@(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*\\>(?:(?:\\r\\n)?[ \\t])*)|(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)*:(?:(?:\\r\\n)?[ \\t])*(?:(?:(?:[^()<>@,;:\\\\\".\\[\\]\\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*))*@(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*|(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)*\\<(?:(?:\\r\\n)?[ \\t])*(?:@(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*(?:,@(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\]\\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*)*:(?:(?:\\r\\n)?[ \\t])*)?(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*))*@(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*\\>(?:(?:\\r\\n)?[ \\t])*)(?:,\\s*(?:(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*))*@(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*|(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)*\\<(?:(?:\\r\\n)?[ \\t])*(?:@(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*(?:,@(?:(?:\\r\\n)?[\\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*)*:(?:(?:\\r\\n)?[ \\t])*)?(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*))*@(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*\\>(?:(?:\\r\\n)?[ \\t])*))*)?;\\s*)";
boolean matches = Pattern.compile(regexp).matcher("Mark Mustermann <email@email.de>").matches();
System.out.println(matches);
via Unite-IT
String regexp = "(?:(?:\\r\\n)?[ \\t])*(?:(?:(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[\\t]))*\"(?:(?:\\r\\n)?[ \\t])*))*@(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*|(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)*\\<(?:(?:\\r\\n)?[ \\t])*(?:@(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[\\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*(?:,@(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[\\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*)*:(?:(?:\\r\\n)?[ \\t])*)?(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*))*@(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*\\>(?:(?:\\r\\n)?[ \\t])*)|(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)*:(?:(?:\\r\\n)?[ \\t])*(?:(?:(?:[^()<>@,;:\\\\\".\\[\\]\\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*))*@(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*|(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)*\\<(?:(?:\\r\\n)?[ \\t])*(?:@(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*(?:,@(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\]\\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*)*:(?:(?:\\r\\n)?[ \\t])*)?(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*))*@(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*\\>(?:(?:\\r\\n)?[ \\t])*)(?:,\\s*(?:(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*))*@(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*|(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)*\\<(?:(?:\\r\\n)?[ \\t])*(?:@(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*(?:,@(?:(?:\\r\\n)?[\\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*)*:(?:(?:\\r\\n)?[ \\t])*)?(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\"(?:[^\\\"\\r\\\\]|\\\\.|(?:(?:\\r\\n)?[ \\t]))*\"(?:(?:\\r\\n)?[ \\t])*))*@(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*)(?:\\.(?:(?:\\r\\n)?[ \\t])*(?:[^()<>@,;:\\\\\".\\[\\] \\000-\\031]+(?:(?:(?:\\r\\n)?[ \\t])+|\\Z|(?=[\\[\"()<>@,;:\\\\\".\\[\\]]))|\\[([^\\[\\]\\r\\\\]|\\\\.)*\\](?:(?:\\r\\n)?[ \\t])*))*\\>(?:(?:\\r\\n)?[ \\t])*))*)?;\\s*)";
boolean matches = Pattern.compile(regexp).matcher("Mark Mustermann <email@email.de>").matches();
System.out.println(matches);
via Unite-IT
Donnerstag, 4. November 2010
Wie in den guten, alten Zeiten des Web
Erinnert sich noch jemand an die guten alten Zeiten des Web? Zuerst hat AOL die Haushalte mit Online-CDs geflutet und nicht viel später wurde der Webspace-Anbieter Geocities zu einer der größten Anlaufstellen für private, selbst gebastelte HTML-Seiten, die so ein gewisses Feeling hatten. Dieses Feeling kann man sich mit dem Geocities-izer zurückholen.
Abonnieren
Posts (Atom)