Wörter finden in String

  • Hallo zusammen,

    aktuell kämpfe ich mit dem Problem bestimmte Inhalte in einem String zu finden. Mir bekannt sind nur die 2-3 Startbuchstaben. Als Endzeichen können Kommas(,), Punkte(.), Leerzeichen( ) oder unsichtbare Zeichen LF auftauchen.

    ich habe an die Lösung gedacht:

    aber aktuell ohne richtigen Erfolg.

    Könnte jemand ein Rat geben wo es schief geht?

    Result 1 suche ich nach Wortanfang "Ab" und Ende des Wortes. Aktuell scheint gut zu funktionieren bis minus kommt.

    Result 2 suche ich nach "Str" und Ende des Wortes --> aktuell nur "Stra" als Lösung

    Frage 2: Wie heirate ich beide Bedingungen in einem ?


    Danke und Gruß

    3 Mal editiert, zuletzt von tubsids (26. November 2019 um 16:04)

    • Offizieller Beitrag

    "\b" und "\w" matchen nur: A-Za-z0-9.

    Deswegen muss man die Zeichen schon selbst zusammenstellen, die als Ende in Frage kommen:

    AutoIt
    #include <Array.au3>
    $sString = "Fahre ich in Abgrund1 Abgrund2_oder Abgrund3, Abgrund4-4; oder folge folge folgeich der Straße? Text kann Sonderzeichen enthalten"  & @CRLF & "Fahre ich in Abgrund Abgrundoder Abgrund, Abgrund; oder folge folge folgeich der Straße? Text egal PRE"& @CRLF
    MsgBox(0,$sString,"Text")
    ;This works by searching for the beginning of a word (\b), then the letters "Ab", then any number of repetitions of alphanumeric
    ;characters (\w*), then the end of a word (\b).
    
    $aResult = StringRegExp($sString,'(Ab.+?)(?:[ ;_,-\.\?\v])',3)
    _ArrayDisplay($aResult,"Results 1")
    $aResult = StringRegExp($sString,'(Str.+?)(?:[ ;_,-\.\?\v])',3)
    _ArrayDisplay($aResult,"Results 2")

    Edit: Zur Frage 2:

    AutoIt
    $aResult = StringRegExp($sString,'((?:Str|Ab).+?)(?:[ ;_,-\.\?\v])',3)
    _ArrayDisplay($aResult,"Results 2")
  • "\b" und "\w" matchen nur: A-Za-z0-9.

    Etwas fehlt: den Unterstrich "_" findet "\w" auch noch, "\b" jedoch unlogischerweise nicht.

    Deswegen muss man die Zeichen schon selbst zusammenstellen, die als Ende in Frage kommen:

    Muss man nicht zwingend:

    AutoIt
    $aResult = StringRegExp($sString, '(*UCP)(?:Ab|Str)[\p{Xan}]+', 3)
    _ArrayDisplay($aResult, 'Results 3')

    Das tut's auch, ist universeller bezüglich den Wortendezeichen, meiner Meinung nach etwas übersichtlicher und erfüllt ebenso die Bedingung:

    Frage 2: Wie heirate ich beide Bedingungen in einem ?

    Allerdings ist es wegen (*UCP) wahrscheinlich um einige Millisekunden langsamer, weshalb auch das hier denkbar wäre:

    AutoIt
    $aResult = StringRegExp($sString, '(?:Ab|Str)[[:alnum:]äöüßÄÖÜ]+', 3)
    _ArrayDisplay($aResult, 'Results 3')

    Edit: Verflixt, war ich wohl zu langsam.

    Gruß, fee

    • Offizieller Beitrag

    Da der TS nicht explizit kyrillsche, japanische, etc. Texte angeführt hat, sollte man Unicode eher vermeiden. In unserem Sprachraum ist mit Windows-1252 alles abgedeckt (Textdateien sind standardmäßig meist in dieser Kodierung) und wenn ich multilingual arbeiten wollte, hätte ich eh das Problem, dass ich mit Dateien unterschiedlicher Kodierung arbeiten müsste. Wiederum ist das Ermitteln der Kodierung (wenn nicht im Text extra hinterlegt) nur unsicher möglich.


    Persönlich wäre ich ja eher dafür, dass Hersteller von Editoren gezwungen werden Textdateien ausschließlich in Unicode zu speichern. Das würde viel Frust beim Programmieren ersparen. ;)

  • Hallo zusammen,

    Danke Euch für die Rückmeldung. Ich habe aktuell ein weiteres Problem: mit einzigen Wort als Suchstring.

    Beispiel


    Code
    #include <Array.au3>
    $sString = "Strasse"
    MsgBox(0,"text",$sString)
    $aResult = StringRegExp($sString,'((?:Str|Ab).+?)(?:[\) ;,\.\?\v])',3)
    _ArrayDisplay($aResult,"Results")

    Wie soll die StringRexExp erweitert werden, um das einzige Wort auch abfangen zu können?

    Mit dem Vorschlag von fee krigt man es raus, aber ich möchte auch anderen Zeichen am Ende betrachten, falls die kommen (auch " und ' --> habe bis dahin nicht hinbekommen)

    Danke und Gruß

    Einmal editiert, zuletzt von tubsids (28. November 2019 um 10:36)

  • Wenn du einen meiner Vorschläge, vorzugsweise den letzten, wie Bugfix so schön erklärt hat, auf ein einziges Wort anwendest, dann liefert dir StringRegExp() doch ein Array zurück, das nur ein Feld mit dem Index [0] hat.

    Die möglicherweise dem Wort folgenden nicht-alphanumerischen Zeichen betrachtet mein regulärer Ausdruck doch gar nicht. Oder möchtest du das genaue Gegenteil davon?

    Dann musst du sozusagen nur meinen und einen Teil von Oscars Code "vereinen", also innerhalb der eckigen Klammern die gewünschten Zeichen ergänzen.

    Zwei Beispiele mit " und ' wie gewünscht:

    AutoIt
    $aResult = StringRegExp($sString, '(?:Ab|Str)[[:alnum:]äöüßÄÖÜ''"]+', 3)
    _ArrayDisplay($aResult, 'Results 3')

    oder

    AutoIt
    $aResult = StringRegExp($sString, 'Strasse[''"]*', 3)
    _ArrayDisplay($aResult, 'Results 3')

    Gruß, fee

    4 Mal editiert, zuletzt von fee (28. November 2019 um 11:42)