AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Prüfen ob Wörter in einem String vorkommen, Reihenfolge egal
Thema durchsuchen
Ansicht
Themen-Optionen

Prüfen ob Wörter in einem String vorkommen, Reihenfolge egal

Ein Thema von Gambit · begonnen am 23. Aug 2004 · letzter Beitrag vom 19. Okt 2004
Antwort Antwort
Seite 2 von 4     12 34      
Benutzerbild von lume96
lume96

Registriert seit: 14. Sep 2003
Ort: Rognac/Marseille - Frankreich
128 Beiträge
 
Delphi 7 Professional
 
#11

Re: Prüfen ob Wörter in einem String vorkommen, Reihenfolge

  Alt 23. Aug 2004, 17:37
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
Lutz Meyer
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#12

Re: Prüfen ob Wörter in einem String vorkommen, Reihenfolge

  Alt 23. Aug 2004, 17:47
Zitat von lume96:
...2) Durch den direkten Vergleich mit Pos() werden auch Substrings gefunden,...
Hai Lutz,
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;
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Gambit

Registriert seit: 28. Mai 2003
680 Beiträge
 
Delphi 7 Professional
 
#13

Re: Prüfen ob Wörter in einem String vorkommen, Reihenfolge

  Alt 23. Aug 2004, 18:55
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
  Mit Zitat antworten Zitat
Benutzerbild von lume96
lume96

Registriert seit: 14. Sep 2003
Ort: Rognac/Marseille - Frankreich
128 Beiträge
 
Delphi 7 Professional
 
#14

Re: Prüfen ob Wörter in einem String vorkommen, Reihenfolge

  Alt 23. Aug 2004, 19:10
Zitat von Sharky:
Hai Gambit,

mit den Schlüsselwörtern von mir hätte es eigentlich gehen sollen
Hier mal mein Versuch:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  str1 : String;
  str2 : String;
  sl : TStringList;
  ndx : Integer;
  okay : Boolean;
begin
  str1 := 'Otto Harfe spielt gern';
  str2 := 'Otto spielt gern Harfe am Wochenende';
  okay := False;
  sl := TStringList.Create;
  try
    sl.Delimiter := ' ';
    sl.DelimitedText := str1;
    for ndx := 0 to pred (sl.Count) do
    begin
      okay := Pos (sl.Strings[ndx],str2) > 0; // Wort ist vorhanden
      if not (okay) then
      begin
        break;
      end;
    end;
  finally
    FreeAndNil (sl);
  end;
  if (okay) then
  begin
    ShowMessage ('Alle Wörter gefunden');
  end
  else
  begin
    ShowMessage ('Nicht alle Wörter gefunden');
  end;
end;
Dann würd ich doch einfach Sharkys Code von oben benutzen (habs noch mal gequoted) und

folgende Stelle

Delphi-Quellcode:
  try
    sl.Delimiter := ' ';
    sl.DelimitedText := str1;
    for ndx := 0 to pred (sl.Count) do
    begin
wie folgt erstetzen
Delphi-Quellcode:
  try
    SplitTextIntoWords(DeineString,s1); // Aus dem Swiss-Center
// sl.Delimiter := ' ';
// sl.DelimitedText := str1;
    for ndx := 0 to pred (sl.Count) do
    begin
Hoffe, dass das so klappt.

MfG
Lutz
Lutz Meyer
  Mit Zitat antworten Zitat
Gambit

Registriert seit: 28. Mai 2003
680 Beiträge
 
Delphi 7 Professional
 
#15

Re: Prüfen ob Wörter in einem String vorkommen, Reihenfolge

  Alt 23. Aug 2004, 19:35
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
  Mit Zitat antworten Zitat
Benutzerbild von lume96
lume96

Registriert seit: 14. Sep 2003
Ort: Rognac/Marseille - Frankreich
128 Beiträge
 
Delphi 7 Professional
 
#16

Re: Prüfen ob Wörter in einem String vorkommen, Reihenfolge

  Alt 23. Aug 2004, 19:52
Zitat von Gambit:
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
Kein Problem, einfach die Funktion "IsCharAlpha(S[startpos])" durch eine Eigene ersetzen, z.B.:
Delphi-Quellcode:
Function IsCharAlpha2(const mychar : string) : boolean;
const
 alphachar = 'abcd....xyz123...90';
begin
 result := (Pos(lowercase(mychar),alphachar)>0);
end;
wobei 'alphachar' 'ne Stringkonstante ist, in der Du alle Buchstaben, Zahlen, usw... hintereinander auslistest, welche Du als Buchstabe interpretiert haben willst.

Kommen wir der Sache näher
MfG
Lutz
Lutz Meyer
  Mit Zitat antworten Zitat
Gambit

Registriert seit: 28. Mai 2003
680 Beiträge
 
Delphi 7 Professional
 
#17

Re: Prüfen ob Wörter in einem String vorkommen, Reihenfolge

  Alt 23. Aug 2004, 20:02
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
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#18

Re: Prüfen ob Wörter in einem String vorkommen, Reihenfolge

  Alt 23. Aug 2004, 20:31
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 )

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();
        }
    }
}
Angehängte Dateien
Dateityp: exe findmatches.exe (28,0 KB, 10x aufgerufen)
  Mit Zitat antworten Zitat
Gambit

Registriert seit: 28. Mai 2003
680 Beiträge
 
Delphi 7 Professional
 
#19

Re: Prüfen ob Wörter in einem String vorkommen, Reihenfolge

  Alt 23. Aug 2004, 20:48
@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
  Mit Zitat antworten Zitat
Benutzerbild von lume96
lume96

Registriert seit: 14. Sep 2003
Ort: Rognac/Marseille - Frankreich
128 Beiträge
 
Delphi 7 Professional
 
#20

Re: Prüfen ob Wörter in einem String vorkommen, Reihenfolge

  Alt 23. Aug 2004, 21:27
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:
const
 alphachar = 'abcdefghijklmnopqrstuvwxyz1234567890';
Ich war nur zu faul alle Buchstaben aufzulisten, deshalb die "...".

Du kannst sie noch durch Umlaute ergänzen, wenn Du willst.

Die Linie
result := (Pos(lowercase(mychar),alphachar)>0); tut folgendes :

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
Lutz Meyer
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:16 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz