RegEx > Wörter mit großgeschriebenen Anfangsbuchstaben finden
Paul
- php
Hallo,
leider bin ich in dem Bereich RegExp ein absoluter Anfänger und stehe derzeit vor dem Problem, das ich in einem String alle Wörter finden (und in einem Array speichern will) die mit einem Großbuchstaben beginnen. Ausgeschlossen sollen allerdings Wörter sein, die an einem Satzanfang (nach dem ersten Vorkommen eines Satzzeichens) stehen, also:
String: "Der Hund schläft in der Hundehütte. Sein Futter steht draussen."
sollte die RegEx die Wörter Der, Hund, Hundehütte, Futter finden, aber dabei "Sein" (Wort nach Satzanfang/Satzzeichen) auslassen.
Könnte mir hier jemand dabei helfen ??
VG
Paul
gudn tach!
leider bin ich in dem Bereich RegExp ein absoluter Anfänger und stehe derzeit vor dem Problem, das ich in einem String alle Wörter finden (und in einem Array speichern will) die mit einem Großbuchstaben beginnen. Ausgeschlossen sollen allerdings Wörter sein, die an einem Satzanfang (nach dem ersten Vorkommen eines Satzzeichens) stehen
deine problembeschreibung ist eigentlich schon so perfekt, dass du vermutlich keine grossen probleme haben solltest, das selbst hinzubekommen. ;-)
hast du denn schon im php-manual ein wenig nachgelesen und was ausprobiert?
mit preg_match_all und dem regexp
/\b[A-ZÄÖÜ][a-zäöüß]+/
wuerdest du alle woerter matchen, die mit einem grossbuchstaben beginnen, wobei hier woerter z.b. keinen bindestrich enthalten duerften.
jetzt moechtest du allerdings noch, dass den woertern nicht ". " vorangeht, also kannst du z.b. zero-width negative look-behind-assertions verwenden:
/(?<![.!?] )\b[A-ZÄÖÜ][a-zäöüß]+/
hilft das?
prost
seth
/(?<![.!?] )\b[A-ZÄÖÜ][a-zäöüß]+/
Kleine Ergänzung: wenn du die Backreferenzes einfangen möchtest, musst du den entsprechenden Teilausdruck einklammern.
/(?<![.!?] )\b([A-ZÄÖÜ][a-zäöüß]+)/
Hallo,
leider bin ich in dem Bereich RegExp ein absoluter Anfänger und stehe derzeit vor dem Problem, das ich in einem String alle Wörter finden (und in einem Array speichern will) die mit einem Großbuchstaben beginnen.
Ausgeschlossen sollen allerdings Wörter sein, die an einem Satzanfang (nach dem ersten Vorkommen eines Satzzeichens) stehen, also:
String: "Der Hund schläft in der Hundehütte. Sein Futter steht draussen."
sollte die RegEx die Wörter Der, Hund, Hundehütte, Futter finden, aber dabei "Sein" (Wort nach Satzanfang/Satzzeichen) auslassen.
Könnte mir hier jemand dabei helfen ??
Ein Problem sind z.B. die Satzzeichen. Da müsste man nämlich alle Möglichkeiten durchgehen. Dieser Regex[1] funktioniert zwar bei deinem Beispiel, versagt allerdings, wenn ein anderes Satzzeichen genommen wird, als vorgegeben. Er funktioniert auch nicht, wenn hinter einem Wort, ein Zeilenumbruch stattfindet. Aber vielleicht reicht dir das ja. (nicht getestet)
[1] /[^.;?!] ([A-Z].+?)[.,;!? ]/
Moin Moin!
Hausaufgabe oder ernstes Problem?
In beiden Fällen hilft http://www.php.net/manual/en/ref.pcre.php und http://www.php.net/manual/en/reference.pcre.pattern.syntax.php
Gehen wir's mal systematisch an.
Du suchst primär Großbuchstaben: /[A-Z]/
Die sollen am Wortanfang stehen, also einer Wortgrenze folgen: /\b[A-ZÄÖÜ]/
Den Großbuchstaben sollen weitere Kleinbuchstaben folgen, mindestens einer: /\b[A-ZÄÖÜ][a-zÄÖÜäöüß]+/
Nach den Kleinbuchstaben soll das wieder einer Wortgrenze vorhanden sein: /\b[A-ZÄÖÜ][a-zÄÖÜäöüß]+\b/
Und das ganze willst Du einsammeln: /\b([A-ZÄÖÜ][a-zÄÖÜäöüß]+)\b/
Und Du willst nicht, dass Worte nach Satzzeichen gefunden werden: /(?<![.,?!:]\s+)\b([A-ZÄÖÜ][a-zÄÖÜäöüß]+)\b/x sollte das schaffen (ungetestet). Warum diese merkwürdige Einschränkung? Willst Du Artikel ausfiltern? Bei Sätzen wie "Elefanten sitzen nicht auf Autos." fällt die Regel auf die Nase.
Alexander
Mit der Definition des Wortes am Satzanfang gibt es noch Schwierigkeiten. Wenn nun der 2. Satz "Hundefutter steht draußen." lautet, soll dann Hundefutter nicht gefunden werden?
Die Wörten in ein Array speichern könnte mit der Funktion str_word_count gehen. Mit der Funktion strcspn könnte man dann die Einträge im Array auf Großbuchstaben prüfen. Beide Funktionen sind String-Funktionen.
Ich weiß dabei aber nicht, was schneller ist, reguläre Ausdrücke oder Stringfunktionen.
Karl
Hello,
[...]
viel wichtiger scheint mir die Frage zu sein, ob Deine Software schon "Babylon 2k+"-fest ist... :-(((
Da gibt es UTF-8...
http://de2.php.net/manual/de/function.mb-strtoupper.php
Was ist schon "Upcase" in einer Codierung, die für Menschen auf den ersten (und nten) Blick keine erkennbare Ordnung mehr hat?
Ich nehme nicht an, dass es in allen Zeichensätzen überhauot ein "Upcase" gibt, genauso, wie es in dem uns geläufigen keine "Betonungen" gibt.
Ich freue mich schon auf die QUALIFIZIERTEN Beiträge der "Bullschit-Schreier".
Die sollten natürlich nicht nur kritisieren, sondern hautpsächlich erklären ;-)
http://de2.php.net/manual/de/function.mb-strtoupper.php
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom
Moin Moin!
Ich nehme nicht an, dass es in allen Zeichensätzen überhauot ein "Upcase" gibt
So ist es. Diverse Schriftsprachen, insbesondere die nicht lateinischen, nicht griechischen, nicht kyrillischen Schriftarten kennen so etwas wie "groß und klein" gar nicht. Bei den in Westeuropa gebräuchlichen Schriftsprachen muß es nicht zwingend die gleiche Anzahl kleiner und großer Buchstaben geben, wie man sehr schön an Deutsch sieht: 29 Großbuchstaben, 30 Kleinbuchstaben. Ebenso ist die Konvertierung zwischen Groß- und Kleinbuchstaben nicht immer verlustfrei, und insbesondere sind x, toUpperCase(toLowerCase(x)) und toLowerCase(toUpperCase(x)) nicht immer identisch.
Die Deutschen haben mit dem "ß" ein ganz fieses Monster, dass je nach Kontext in "SS" oder "SZ" umgeschrieben werden muß (Maße vs. Masse), und in der Umkehrung kann aus "SS" entweder "ss" oder "ß" werden, genau wie aus "SZ" entweder "sz" oder "ß" werden kann.
Die Franzosen *dürfen* beim toUppperCase() alle Akzente verwerfen (so habe ich das jedenfalls in der Schule gelernt), so dass bis zu fünf verschiedene Zeichen zu einem zusammenfallen *KÖNNEN* (e, é, è, ê, ë => E). Beim Rückweg müssen die Akzente natürlich wieder drangeflickt werden.
Von kleineren Gemeinheiten wie Umschalten der Schreibrichtung von Rechts nach Links und zurück (z.B. beim Mischen von westeuropäischen Sprachen mit Hebräisch oder Arabisch) will ich jetzt gar nicht anfangen.
Deswegen bleibt meine Frage: "Hausaufgabe oder ernstes Problem?"
Im ersten Fall ist das entweder Stoff für eine kleine Semesterarbeit oder ein Lehrer, der die Komplexität des Problems auch nicht ansatzweise erfaßt hat. Im zweiten Fall ist das *EIGENTLICHE* Problem noch nicht erklärt. Sprich: Was soll diese Abfrage erreichen? Hauptwortsuche in deutschen Sätzen? Das geht definitiv nicht mit RegExps alleine, die sind bestenfalls der erste Schritt.
Alexander
Hallo Alexander,
Die Deutschen haben mit dem "ß" ein ganz fieses Monster, dass je nach Kontext in "SS" oder "SZ" umgeschrieben werden muß (Maße vs. Masse), und in der Umkehrung kann aus "SS" entweder "ss" oder "ß" werden, genau wie aus "SZ" entweder "sz" oder "ß" werden kann.
Das stimmt übrigens nicht ganz: Laut den Regeln zur dt. Rechtschreibung, Fassung 2006, Abschnitt 2.3, § 25, E3:
| E3: Bei Schreibung mit Großbuchstaben schreibt man SS, zum Beispiel:
| Straße – STRASSE
Ferner gilt auch (E2 des gleichen §):
| E2: Steht der Buchstabe ß nicht zur Verfügung, so schreibt man ss. In der
| Schweiz kann man immer ss schreiben. Beispiel: Straße – Strasse
Nirgends wird dort »SZ« erwähnt. Das heißt: Wenn entweder der Buchstabe 'ß' nicht vorhanden ist (zum Beispiel auf einer nicht-deutschen Tastatur) oder man etwas Großschreiben will, dann wird *immer* 'ss' (oder 'SS') genommen, *nie* 'sz' / 'SZ'. Das wiederum bedeutet: Maße wird in Großschreibung zu MASSE - und man kann dann nur noch aus dem Kontext unterscheiden, ob jetzt nun Masse oder Maße gemeint ist.
Kann natürlich sein, dass es früher mal anders war, die wenigen Jahre in der Grundschule bei mir, als die alte Rechtschreibung noch galt, habe ich mich noch nicht für so etwas interessiert. ;-)
Übrigens: Die ganze Arbeit, sich über Groß- und Kleinschreibung Gedanken zu machen, hat einem schon das Unicode-Konsortium abgenommen. Zum einen gibt's einen Teil des Unicode-Standards, der sich mit dem Thema beschäftigt: Unicode Standard Annex #21: Case Mappings, zum anderen gibt es eine Datei, die Teil des Unicode-Standards ist, die Informationen zum Mapping verschiedener Zeichen bereitstellt: http://www.unicode.org/Public/UNIDATA/CaseFolding.txt (dort wird übrigens lustiger- und zufälligerweise im Header gerade Dein Beispiel mit "Maße" <-> "MASSE" erwähnt ;-))
Und auch allgemein ist die Seite unicode.org SEHR hilfreich, wenn es auch nur ansatzweise um Internationalisierung geht! Dort haben sich schlaue Köpfe nämlich schon SEHR VIELE Gedanken zu allen möglichen Themen gemacht und entsprechende Informationen bereitgestellt. Wenn man eine konkrete Fragestellung hat, schadet es nicht, sich dort mal umzusehen. Es gibt dort ETLICHE nützliche Dinge, die einem eine MENGE Kopfschmerzen bezüglich der Konzeption abnehmen (und dafür eine Menge Kopfschmerzen bezüglich der Implementierung bereiten, wenn man's ganz korrekt machen will ;-)). Sehr interessant ist zum Beispiel auch das Common Locale Data Repository, dort findet man zum Beispiel auch Ländernamen in allen möglichen Sprache, usw. usf. </ausschweif>
Ferner: Wenn man in PHP sowieso mit regulären Ausdrücken Groß- und Kleinschreibung matchen will, dann empfiehlt sich ein Blick in http://de3.php.net/manual/en/reference.pcre.pattern.syntax.php - dort gibt's einen Abschnitt "Unicode character properties". Wenn der U-modifier also aktiviert ist bei preg_match, dann matcht \p{Ll} z.B. einen Kleinbuchstaben. Wie man sieht, haben viele Bibliotheken bestimmte Dinge bereits implementiert, so dass man sich nicht mehr selbst um sie kümmern muss - das kann auch sehr hilfreich sein.
Viele Grüße,
Christian
gudn tach!
Die Deutschen haben mit dem "ß" ein ganz fieses Monster, dass je nach Kontext in "SS" oder "SZ" umgeschrieben werden muß (Maße vs. Masse), und in der Umkehrung kann aus "SS" entweder "ss" oder "ß" werden, genau wie aus "SZ" entweder "sz" oder "ß" werden kann.
Das stimmt übrigens nicht ganz [...] Kann natürlich sein, dass es früher mal anders war
Jau, es stimmte mal ganz. gaaanz frueher war mal sogar _nur_ SZ richtig. dann war eine zeit lang beides ok. mittlerweile soll ß in versalschrift nur noch als "SS" geschrieben werden. aaaaber auch das ist nur ein brocken der ganzen wahrheit, denn das versal-ß existiert auch.
siehe
http://de.wikipedia.org/wiki/Eszett und
http://de.wikipedia.org/wiki/Versal-Eszett
prost
seth