Avatar billede shemeri Praktikant
20. august 2005 - 07:40 Der er 16 kommentarer og
1 løsning

Java Regex

hej,

Er der nogen der kan fortælle mig hvorfor virker min kode ikke :-(

--------------------------

  public String GetPath(String path){
 
    if(path.substring(1,2).equals(" "))
      path = path.substring(0,1) + path.substring(2);

    final int flags = Pattern.CASE_INSENSITIVE;   
    Pattern pattern = Pattern.compile("[MLVHCSTQAZ]",flags);
    Matcher matcher = pattern.matcher(path);
   
    while(matcher.find()){
      path = PathCommands(path,matcher.group(),matcher.start(),matcher.end());
    }
    return path;
  }

  public String PathCommands(String path, String match, int start, int end){
   
    if(start != 0){   
      //check if there is whitespace before the found command
      if (path.substring(start-1,end-1).equals(" ")){
        path  = path.substring(0, start-1) + path.substring(end-1);
      }
      else
        System.out.println("No space matched");
    }
    else
      return path;

  return path;
  }

Håber der er nogen der kan hjælpe?
Avatar billede shemeri Praktikant
20. august 2005 - 07:43 #1
her er min path string = "M 0 L112 L 20 124L 40 L129 L 60 126 M CL z Z"
Avatar billede nielle Nybegynder
20. august 2005 - 09:05 #2
Hvorfor matcher du ikke direkte på blanktegn+kommando?

Pattern.compile(" [MLVHCSTQAZ]",flags);
Avatar billede erikjacobsen Ekspert
20. august 2005 - 09:16 #3
Hvad er det den skal finde i din streng? - det må kunne gøres meget nemmere.
Avatar billede arne_v Ekspert
20. august 2005 - 09:29 #4
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Regex {
    public static void test(String s) {
        Pattern pattern = Pattern.compile("[MLVHCSTQAZ]+",Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(s);
        while(matcher.find()){
            System.out.println(matcher.group());
        }
    }
    public static void main(String[] args) {
        test("M 0 L112 L 20 124L 40 L129 L 60 126 M CL z Z");
    }
}


skriver ihvertfald:

M
L
L
L
L
L
M
CL
z
Z
Avatar billede shemeri Praktikant
20. august 2005 - 18:31 #5
OBS:
Jeg har glemt dette:
---------------------------
while(matcher.find()){
path = PathWhiteSpace(path,matcher.group(),matcher.start(),matcher.end());
}
---------------------------

Den skriver M L L osv men ikke updatere min path streng?

Det jeg prøver og er:
1. finder all Commands som er i [MLVHCSTQAZ]. Find char før commanden og see om det er whitespace. Hvis det er, jeg fjerne den.
2. finder all commands som er i [MLVHCSTQAZ]. Find char efter commanden. Hvis den er whitespace, jeg fjerne den igen.

ovenstående gør jeg ved at kalde min metode PathCommands() som gøre hvad den skal gør og return'er path strengen igen. Den finder første L i strengen og opdatere strengen så den ikke har mellemrum før den første L command'en. Resten af commend'er, sker ikke noget med?!

Det er ihvertfald hvad jeg vil gerne gør med koden jeg har.

However, det jeg prøver og gør er:
En streng kan ser sådan ud
"M 0 112 L 20 124L 40 L129 L 60 -126.32 V -34.342 H -45 Z"

1.Finder alle mellemrum og see om de har betydning, hvis ikke, jeg fjerne dem.
  Mellemrum før og efter command'er har ingen betydning.
  Mellemrum før et negativ tal har ingen betydning. Altså, mellemrum mellem positiv og  negativ point'er skal fjernes.

Det er det jeg prøver og gøre :-)
Avatar billede erikjacobsen Ekspert
20. august 2005 - 18:32 #6
Jeg forstår ikke hvad du skrive. Kan du skrive præcis hvad
  "M 0 112 L 20 124L 40 L129 L 60 -126.32 V -34.342 H -45 Z"
skal give som output?
Avatar billede shemeri Praktikant
20. august 2005 - 18:42 #7
min skyld :-)

først, strengen er jo SVG d attribute i path element.

f.eks.
"M 0 112 L 20 124 L 40 45 L129 30L 60 -126.32 V -34.342 H -45 Z" skal give output som
"M0 112L20 124L40 45L129 30L60-126.32V-34.342H-45Z"

strengen kan være meget større...
Avatar billede shemeri Praktikant
20. august 2005 - 18:44 #8
svar 20/08-2005 18:31:17 var til arne_v :-)
Avatar billede arne_v Ekspert
20. august 2005 - 18:51 #9
package august;

public class RegexReplace {
    public static void main(String[] args) {
        String s = "M 0 112 L 20 124 L 40 45 L129 30L 60 -126.32 V -34.342 H -45 Z";
        System.out.println(s);
        System.out.println("M0 112L20 124L40 45L129 30L60-126.32V-34.342H-45Z");
        String s2 = s.replaceAll("([ ]?)([MLVHCSTQAZ])([ ]?)","$2");
        System.out.println(s2);
    }
}

udskriver

M 0 112 L 20 124 L 40 45 L129 30L 60 -126.32 V -34.342 H -45 Z
M0 112L20 124L40 45L129 30L60-126.32V-34.342H-45Z
M0 112L20 124L40 45L129 30L60 -126.32V-34.342H-45Z

jeg er ikke helt klar over om forskellen er ønsket eller ikke ønsket
Avatar billede shemeri Praktikant
20. august 2005 - 18:53 #10
forskellen mellem store og små bogstaver er ønsket men jeg tror jeg kan lave den om til

s.replaceAll("([ ]?)([MLVHCSTQAZ][mlvhcstqaz])([ ]?)","$2");
Avatar billede arne_v Ekspert
20. august 2005 - 18:55 #11
s.replaceAll("([ ]?)([MLVHCSTQAZmlvhcstqaz])([ ]?)","$2")

tror jeg nu
Avatar billede arne_v Ekspert
20. august 2005 - 18:56 #12
der er iøvrigt en metode i Pattern klassen hvor man kan angive at den ikke
skal være case sensitiv, men ...
Avatar billede shemeri Praktikant
20. august 2005 - 19:03 #13
det virker næsten og det er kun en linie i Java :-)
men hvordan kan jeg lave den om til
M0 112L20 124L40 45L129 30L60 -126.32V-34.342H-45Z
fra
M0 112L20 124L40 45L129 30L60-126.32V-34.342H-45Z

dvs. alle negative point'er uden mellemrum foran?
Avatar billede arne_v Ekspert
20. august 2005 - 19:10 #14
prøv

s.replaceAll("([ ]?)([MLVHCSTQAZ]|-)([ ]?)","$2")
Avatar billede arne_v Ekspert
20. august 2005 - 19:10 #15
hov - de små bogstaver skal lige puttes ind
Avatar billede shemeri Praktikant
20. august 2005 - 20:20 #16
det virker :-) ...tak for din hjælp...
Jeg ved ikke hvorfor jeg skrev så meget kode :-(

svar så får du point'er med et :-)
Avatar billede arne_v Ekspert
20. august 2005 - 20:22 #17
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester