![]() |
Re: Prüfen ob Wörter in einem String vorkommen, Reihenfolge
Sharkys Funktion sollte funktionieren, allerdings mit zwei Einschränkungen :
1) Als Delimiter zwichen zwei Wörtern setzt er ein Leerzeichen voraus, d.h. bei str1 := 'Otto Harfe spielt gern.'; str2 := 'Otto spielt gern Harfe am Wochenende'; würde es nicht mehr klappen, denn das letzte Wort der str1 nach dem Split wäre "gern." (mit dem Punkt am Ende). 2) Durch den direkten Vergleich mit Pos() werden auch Substrings gefunden, d.h. bei str1 := 'Ot Harfe spielt gern'; str2 := 'Otto spielt gern Harfe am Wochenende'; würde er sagen, is OK den 'Ot' ist in 'Otto' enthalten. Zum splitten der Wörter würde ich eher die Formel aus Deinem Code vom Swiss-Center benutzen und beim Vergleich, wie schon oben geschrieben das Pos leicht verändern. MfG. Lutz |
Re: Prüfen ob Wörter in einem String vorkommen, Reihenfolge
Zitat:
das ist durch den einsatz einer zweiten TStringList leich zu umgehen. Dann bleibt "nur noch" das Problem mit dem Delimiter ;-)
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var str1 : String; str2 : String; sl1 : TStringList; sl2 : TStringList; ndx : Integer; okay : Boolean; begin str1 := 'Otto Harfe spielt gern'; str2 := 'Otto spielt gern Harfe am Wochenende'; okay := False; sl1 := TStringList.Create; sl2 := TStringList.Create; try sl1.Delimiter := ' '; sl1.DelimitedText := str1; sl2.Delimiter := ' '; sl2.DelimitedText := str2; for ndx := 0 to pred (sl1.Count) do begin okay := sl2.IndexOf(sl1.Strings[ndx]) > -1; if not (okay) then begin break; end; end; finally FreeAndNil (sl1); FreeAndNil (sl2); end; if (okay) then begin ShowMessage ('Alle Wörter gefunden'); end else begin ShowMessage ('Nicht alle Wörter gefunden'); end; end; |
Re: Prüfen ob Wörter in einem String vorkommen, Reihenfolge
Also ich habe jetzt festgestellt, dass das Auffinden von Teilstrings, also z.B Woche in Wochenende teilweise sogar notwendig ist. Da die Methode splitTextintoWords die einzelnen Worte ja in eine Stringlist schreibt, brauche ich dann doch nur noch in einer Schleife die einzelnen Wörter mittels Pos im zweiten String suchen oder seh ich das jetzt falsch?
Gruß Gambit |
Re: Prüfen ob Wörter in einem String vorkommen, Reihenfolge
Zitat:
folgende Stelle
Delphi-Quellcode:
wie folgt erstetzen
try
sl.Delimiter := ' '; sl.DelimitedText := str1; for ndx := 0 to pred (sl.Count) do begin
Delphi-Quellcode:
Hoffe, dass das so klappt.
try
SplitTextIntoWords(DeineString,s1); // Aus dem Swiss-Center // sl.Delimiter := ' '; // sl.DelimitedText := str1; for ndx := 0 to pred (sl.Count) do begin MfG Lutz |
Re: Prüfen ob Wörter in einem String vorkommen, Reihenfolge
gute Idee, aber ich glaube den Swiss-Code kann ich doch nicht nehmen weil er nur Buchstaben berücksichtigt und Zahlen außen vor läßt. Mit der "Der Pate 2" hätte ich dann wiederum Probleme, du weißt ja, was ich meine Lutz...
Gambit |
Re: Prüfen ob Wörter in einem String vorkommen, Reihenfolge
Zitat:
Delphi-Quellcode:
wobei 'alphachar' 'ne Stringkonstante ist, in der Du alle Buchstaben, Zahlen, usw... hintereinander auslistest, welche Du als Buchstabe interpretiert haben willst.
Function IsCharAlpha2(const mychar : string) : boolean;
const alphachar = 'abcd....xyz123...90'; begin result := (Pos(lowercase(mychar),alphachar)>0); end; Kommen wir der Sache näher :?: MfG Lutz |
Re: Prüfen ob Wörter in einem String vorkommen, Reihenfolge
Mir raucht langsam der Kopf, denn ich glaube nicht. Selbst wenn ich den String in einzelne Wörter zerlegen kann und das scheinen wir ja hinzukriegen, wüßte ich jetzt nicht mehr, wie ich daraus eine Select-Abfrage basteln sollte...ich sollte das Programmieren vielleicht nochmal von vorne anfangen...
Gruß Gambit |
Re: Prüfen ob Wörter in einem String vorkommen, Reihenfolge
Liste der Anhänge anzeigen (Anzahl: 1)
Falls du ein wenig in .Net interessiert bist...
Ich habe gerade aus "Jux" das Ganze mal in C#2.0 gebastelt (die Beta gibt's kostenlos bei M$ ;) ) Es ist nicht wirklich "hübsch", war aber in 10 Minuten fertig. (mit "IntelliSense tippt man schneller als ein MaiKäfer husten kann :P)
Code:
#region Using directives
using System; using System.Collections.Generic; using System.Windows.Forms; #endregion namespace FindMatches { partial class MainForm : Form { public MainForm() { InitializeComponent(); } private class SearchResult { public Collection<string> Missings; public Dictionary<string, int> Matches; public SearchResult() { Matches = new Dictionary<string, int>(); Missings = new Collection<string>(); } } private int FindMatchingWords( string[] pList, string pSearchWord ) { int oResult = 0; foreach ( string Word in pList ) { if ( Word.Equals(pSearchWord, StringComparison.OrdinalIgnoreCase) ) { oResult++; } } return oResult; } private string[] splitWords( string pList ) { return pList.Split(new char[] { ' ', '\t', '\n', '\r', '.', ',', '?', '!' , ';', '/', '\\', ')', '(', '*','[', ']' ,'\"', '\'', '<', '>', '|' } , StringSplitOptions.RemoveEmptyEntries); } private SearchResult Search( string pSearchWords, string pCompareWords ) { string[] lpSearchWords = splitWords(pSearchWords); string[] lCompareWords = splitWords(pCompareWords); Dictionary<string, int> Occurances = new Dictionary<string, int>(lpSearchWords.GetLength(0)); foreach ( string SearchWord in lpSearchWords ) { if ( !Occurances.ContainsKey(SearchWord) ) Occurances.Add(SearchWord , FindMatchingWords(lCompareWords, SearchWord)); } SearchResult oResults = new SearchResult(); foreach ( KeyValuePair<string, int> Entry in Occurances ) { if ( Entry.Value == 0 ) { oResults.Missings.Add(Entry.Key); } else { oResults.Matches.Add(Entry.Key, Entry.Value); } } return oResults; } private void CountClick( object sender, EventArgs e ) { SearchResult searchResults; if ( sender == LeftInRightMenuItem ) searchResults = Search(txtLeft.Text, txtRight.Text); else searchResults = Search(txtRight.Text, txtLeft.Text); LeftInRightMenuItem.Checked = ( sender == LeftInRightMenuItem ); RightInLeftMenuItem.Checked = !LeftInRightMenuItem.Checked; #region Adding LV Items... ListViewGroup lvGrpMiss = lvMatches.Groups[0]; ListViewGroup lvGrpMatch = lvMatches.Groups[1]; lvMatches.BeginUpdate(); lvMatches.Items.Clear(); foreach ( KeyValuePair<string, int> Match in searchResults.Matches ) { lvMatches.Items.Add(new ListViewItem(new string[2] { Match.Key, Match.Value.ToString() } , lvGrpMatch)); } foreach ( string Miss in searchResults.Missings ) { lvMatches.Items.Add(new ListViewItem(Miss, lvGrpMiss)); } lvMatches.EndUpdate(); #endregion #region StatusStripes... statusStripCountMissings.Text = string.Format("{0} missing words" , searchResults.Missings.Count); statusStripCountMatches.Text = string.Format("{0} matching words" , searchResults.Matches.Count); #endregion GC.Collect(); } } } |
Re: Prüfen ob Wörter in einem String vorkommen, Reihenfolge
@Lutz: kann es sein, dass da irgendwas noch nicht stimmt an der isCharAlpha2 ? Dat funzt nämlich nicht mehr damit. Also ich habe die Funktion mit reingepackt und tausche beim Aufruf einfach nur isCharAlpha gegen isCharAlpha2 aus...
Gambit P.S ach ne, geht doch, sorry |
Re: Prüfen ob Wörter in einem String vorkommen, Reihenfolge
Hab kein Delphi zuhause und konnte sie daher nicht testen, wüsste aber nicht warum sie nicht funktionieren sollte.
Nur um Missverständnisse auszuschliessen, die Linie alphachar muss komplett zumindest so aussehen :
Delphi-Quellcode:
Ich war nur zu faul alle Buchstaben aufzulisten, deshalb die "...".
const
alphachar = 'abcdefghijklmnopqrstuvwxyz1234567890'; Du kannst sie noch durch Umlaute ergänzen, wenn Du willst. Die Linie
Delphi-Quellcode:
tut folgendes :
result := (Pos(lowercase(mychar),alphachar)>0);
Pos(lowercase(mychar),alphachar) testet ob 'mychar' in 'alphachar' vorkommt und gibt die Position zurück. Soll heissen, wenn mychar einer der Buchstaben/Ziffern der Alphacharkonstante ist, so ist Pos() grösser als 0. Damit wäre dann (Pos() > 0) wahr und somit Result := wahr. Das lowercase(mychar) bewirkt, dass eventuelle Grossbuchstaben in Kleinbuchstaben umgewandelt werden. Daher sind dann 'ABC...XYZ' in der alphachar nicht nötig. So, wenn's trotzdem nicht klappt, einfach noch mal Bescheid sagen. Tschüss, Lutz |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz