Zeile, in der sich die Position im String befindet, auslesen

  • JavaScript

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Chrisber.

    Zeile, in der sich die Position im String befindet, auslesen

    Hallo,

    ich möchte aus einem mehrzeiligen String, von dem ich eine bestimmte Position habe, die Zeile, in der sich diese befindet, ermitteln.
    Zur Zeit mache ich das so:

    JavaScript-Quellcode

    1. l = 0;
    2. lines = val.split("\n");
    3. for (line in lines) {
    4. if (pos >= lines[line].length) {
    5. pos -= (lines[line].length + 1);
    6. l++;
    7. } else {
    8. break;
    9. }
    10. }
    wobei pos die zuvor ermittelte Position (per indexOf()) und val der mehrzeilige Text ist.
    Geht das auch einfacher?

    MfG, BjöNi
    Ungetestet:

    Quellcode

    1. function lineByPosition(search, given)
    2. {
    3. if (given < 0 || given >= search.length)
    4. {
    5. return -1; // invalid
    6. }
    7. for (var pos = search.indexOf("\n"), latest = 0, i = 0; pos != -1; latest = pos + 1, pos = search.indexOf("\n", latest), ++i)
    8. {
    9. if (latest <= given && given < pos)
    10. {
    11. return i;
    12. }
    13. }
    14. return 0; // no lines found, so this must be inside the string which equals line zero
    15. }
    16. var line = lineByPosition("mein\ntest\nstring", 6); // should be 1


    Edit: es wird vermutlich Probleme geben, wenn sich die Position in der letzten Zeile befindet, weil pos == -1 ist und die Schleife vorher abbricht. Habe aber gerade keine Zeit das zu korrigieren, sorry.
    To make foobar2000 a real random music player, I figured out the only way to achieve this is to use Windows Media Player.

    At some point in time, you recognize that knowing more does not necessarily make you more happy.
    Das sieht schonmal sehr vielversprechend aus und funktioniert auch - bis auf deinen genannten Bug. Danke. :)
    Aber ich muss sagen, dass ich da nicht ganz durchblicke. Könntest du mir vl. - wenn du wieder Zeit hast - mal Zeile 8 erklären bzw. was da passiert? Weil dementsprechend kann ich deinen Bug auch nicht korrigieren. Ich denke, ich bleibe jetzt erstmal bei meiner Lösung - ist ja eiglich auch OK.
    Hier eine Langversion. Der Bug sollte behoben sein.

    Quellcode

    1. function lineByPosition(search, given)
    2. {
    3. if (given < 0 || given >= search.length)
    4. {
    5. return -1; // invalid
    6. }
    7. var pos = search.indexOf("\n"); // find first occurance of \n
    8. var latest = 0;
    9. var lineCount = 0;
    10. while (latest != -1) // loop until every line has been iterated
    11. {
    12. if (latest <= given && (given < pos || pos == -1)) // when given is between latest and current pos (or pos is invalid, then it's the last line)
    13. {
    14. return lineCount;
    15. }
    16. ++lineCount;
    17. latest = pos + 1;
    18. pos = search.indexOf("\n", latest); // find next occurance of \n
    19. }
    20. return 0; // no lines found, so this must be inside the string which equals line zero
    21. }
    22. var line = lineByPosition("mein\ntest\nstring", 6); // should be 1
    To make foobar2000 a real random music player, I figured out the only way to achieve this is to use Windows Media Player.

    At some point in time, you recognize that knowing more does not necessarily make you more happy.