suchen in strings

  • C++

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • suchen in strings

    gude,

    zu beginn gleich ma en bisschen c++ code:

    Quellcode

    1. string a="hallo test1 hallo test";
    2. int pos;
    3. pos = a.find("test?");

    des ganze funktioniert natürlich nicht

    ich will also aus einem string die position von test1 raussuchen, allerdings kann anstelle von der 1 auch ne 2 oder 3 oder 4 stehn.
    deshalb hab ich mich gefragt ob man die sich verändernde stelle auch mit nem ? auffüllen kann. funktioniert aber leider nicht

    gibt es da ne möglichkeit des zu lösen??
  • Dafuer gibts regulaere Ausdruecke.

    Quellcode

    1. using System;
    2. using System.Text.RegularExpressions;
    3. public class Test {
    4. public static void Main() {
    5. string a = "hallo test1 hallo test";
    6. int pos;
    7. Match m = Regex.Match(a,"test[1234]");
    8. pos = m.Index;
    9. Console.WriteLine(pos);
    10. }
    11. }
    Alles anzeigen


    Habs mal mit C# gemacht, da ich mit C++ noch weniger am Hut habe.
    Hoffe mal, dass du das von hier aus nach C++ kriegst.
    User helfen Usern: die FSB-Tutoren! (zum Chat) (zur Gruppe)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Skyte ()

  • also ich hab leider von C# keine ahung, aber wie ich schon gesehen habe, meinte ich eig das die zahl nach test irgendein beliebiges zeichen der ASCII-Tabelle sein kann, also nicht nur 1, 2, 3, oder 4 sondern auch & oder # oder - + oder sonstige zeichen/ziffern/buchstaben

    also ich suche sozusagen en platzhalter den ich da einfügen kann, wie z.b. in der windows suche *.rar oder so, damit er nach allen rar dateien sucht
  • BorNoe schrieb:

    das die zahl nach test irgendein beliebiges zeichen der ASCII-Tabelle sein kann, also nicht nur 1, 2, 3, oder 4 sondern auch & oder # oder - + oder sonstige zeichen/ziffern/buchstaben


    Wie ich schon sagte, du brauchst regulaere Ausdruecke. ;)

    Ein beliebiges Zeichen genau ein Mal ist der Punkt.

    Also:

    Quellcode

    1. Match m = Regex.Match(a,"test.");


    Bzw. wohl eher so:

    Quellcode

    1. Match m = Regex.Match(a,"test\S[\s$]");
    User helfen Usern: die FSB-Tutoren! (zum Chat) (zur Gruppe)

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Skyte ()

  • alles klar, aber leider hilft mir des nicht so viel weiter, da ich von C# eig gar kein plan habe und C++ auch gerade nur in der schule lerne und unserer lehrer ziemlich inkompetent scheint und ich mir so mit dem internet o.ä. behilflich sein muss
  • Hab grad n bisschen gegoogelt. Anscheinend gibt es keine Standard Libraries fuer regulaere Ausdruecke in C++.

    Bei Boost ist das wohl dabei: Boost C++ Libraries.


    Eine Moeglichkeit ohne regulaere Ausdruecke waere z.B.:

    Du suchst nach "test" und addierst auf den erhaltenen Index 4 drauf (halt Buchstabenanzahl von "test").
    Und dann kuckst du eben ob das Zeichen an dieser Stelle ein Leerzeichen oder String-Ende ist (oder ggf. ein Satzzeichen).
    Wenn das nicht der Fall ist, dann steht nach "test" halt deine gewuenschte Wildcard.
    Dann addierst du noch eins drauf und kuckst was da ist um dich zu vergewissern, dass es auch genau 1 Wildcard ist und nicht mehr.
    User helfen Usern: die FSB-Tutoren! (zum Chat) (zur Gruppe)

    Dieser Beitrag wurde bereits 18 mal editiert, zuletzt von Skyte ()

  • also erstma danke für deine hilfe, aber leider versteh ich kein wort ^^

    bzw. verstehen schon so recht, aber nicht genau wie ichs anwenden soll.

    vll meldet sich nochma jemand der mir en code beispiel dafür zeigen könnte wie man es am einfachsten mit c++ hinbekommen kann.

    danke trotzdem nochma für deine hilfe
  • Hier:

    C-Quellcode

    1. #include <string>
    2. #include <iostream>
    3. using namespace std;
    4. int isWild(string& str, int pos) {
    5. return (pos < str.length() && str[pos] != ' ' && str[pos] != '.' && str[pos] != ',');
    6. }
    7. int main( void ) {
    8. string a = "hallo test hallo test1";
    9. string search = "test";
    10. int offset = search.length();
    11. int pos = -1;
    12. int npos = 0;
    13. int found = 0;
    14. while (!npos && !found) {
    15. pos = a.find(search,pos+1);
    16. if (pos == string::npos) npos = 1;
    17. else if (isWild(a,pos+offset) && !isWild(a,pos+offset+1)) found = 1;
    18. }
    19. if (npos) {
    20. cout << "Der Text enthaelt kein " << search << "*.\n";
    21. }
    22. else {
    23. cout << search << a[pos+offset] << " befindet sich an Position " << pos << ".\n";
    24. }
    25. return 0;
    26. }
    Alles anzeigen


    In search steht halt wonach gesucht werden soll, in dem Fall also "test".

    Und die Suche ist genau dann erfolgreich, wenn "test*" gefunden wird.
    Wenn man da also z.B. "test12" hat, dann gilt das nicht, weil dort 2 Zeichen dahinter sind, "test1" wuerde gehen.

    Musste sagen, wie du es haben willst.
    Punkt und Komma gelten ebenfalls nicht, kann man halt anpassen, wie man es haben will.
    User helfen Usern: die FSB-Tutoren! (zum Chat) (zur Gruppe)

    Dieser Beitrag wurde bereits 11 mal editiert, zuletzt von Skyte ()