/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
Problemer med regular expressions
Fra : Kristian Thy


Dato : 28-10-03 09:30

Hej. Jeg sidder og har et problem med regular expressions i Java.

Det er ifølge Suns dokumentation
(http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Pattern.html#backref)
muligt at bruge backreferences til forskellige capturing groups ved at
referere til \n, hvilket fanger den n'te capturing group (0 er hele
regexp'en).

Det kan jeg ikke få til at virke.

Jeg har en string hvor jeg vil have ændret "class [Lfoo " og "class
[Lfoo," til hhv. "foo[] " og "foo[],". Det burde så ifølge
dokumentationen skulle gøres således:

output = output.replaceAll( "class \\[L(.*)([ ,])", "\1[]\2" );

Den fanger også det rigtige sted i strengen, men det eneste der kommer
ind er [] - \1 og \2 bliver bare ignoreret. Hjælp! Hvad gør jeg galt?

\\kristian
--
"I'm a pork. I need commitment!"
--Miss Piggy

 
 
Peter Jensen (28-10-2003)
Kommentar
Fra : Peter Jensen


Dato : 28-10-03 11:28

Kristian Thy wrote:

> output = output.replaceAll( "class \\[L(.*)([ ,])", "\1[]\2" );
>
> Den fanger også det rigtige sted i strengen, men det eneste der kommer
> ind er [] - \1 og \2 bliver bare ignoreret. Hjælp! Hvad gør jeg galt?

Jeg er ikke sikker på hvordan regex virker i det system, men plejer man
ikke at escape paranteserne i capturing groups? Altså:

output = output.replaceAll( "class \\[L\(.*\)\([ ,]\)", "\1[]\2" );

Hvor mange '\' tegn der er brug for er jeg ikke sikker på. Gør Java det
nogenlunde som C? Skal det være '\1', eller '\\1'?

Noget andet er at man i nogle systemer skal passe på med '.*', da det
snupper alt for meget.

Der er altså rigeligt med muligheder for at lave fejl, hvilket er
grunden til at jeg hader regular expressions (selv om de kan være meget
nyttige).

--
PeKaJe

Never have children, only grandchildren. -- Gore Vidal

Kristian Thy (28-10-2003)
Kommentar
Fra : Kristian Thy


Dato : 28-10-03 13:37

Peter Jensen uttered:
> Jeg er ikke sikker på hvordan regex virker i det system, men plejer man
> ikke at escape paranteserne i capturing groups? Altså:
>
> output = output.replaceAll( "class \\[L\(.*\)\([ ,]\)", "\1[]\2" );

Nej. Enkelt backslash \( giver compile-fejl ("non-escapable
character"), mens \\( matcher en ( i strengen.

> Hvor mange '\' tegn der er brug for er jeg ikke sikker på. Gør Java det
> nogenlunde som C? Skal det være '\1', eller '\\1'?

Hvis jeg skriver \\1 kommer der et ettal ud i output.

> Noget andet er at man i nogle systemer skal passe på med '.*', da det
> snupper alt for meget.

Ja, men jeg kan konstatere at den fjerner det rigtige. Den vil bare
ikke sætte det ind igen.

> Der er altså rigeligt med muligheder for at lave fejl, hvilket er
> grunden til at jeg hader regular expressions (selv om de kan være meget
> nyttige).

Jeg er ganske enig

\\kristian
--
President Bush may be the smartest military president in history.
First, he gets Iraq to destroy all of their own weapons. Then he
declares war.
-- Jay Leno

Jesper Matthiesen (28-10-2003)
Kommentar
Fra : Jesper Matthiesen


Dato : 28-10-03 12:28


"Kristian Thy" <thy@it.edu> wrote in message
news:bnl9e9$12eo3i$1@ID-157676.news.uni-berlin.de...
> Hej. Jeg sidder og har et problem med regular expressions i Java.
>
> Det er ifølge Suns dokumentation
>
(http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Pattern.html#backre
f)
> muligt at bruge backreferences til forskellige capturing groups ved at
> referere til \n, hvilket fanger den n'te capturing group (0 er hele
> regexp'en).

Nu er det et stykke tid siden men jeg gjorde cirka noget i denne retning:

String toSearch = "xxxxx";
StrRegExp = "(" + Group1 + ")" + "|" "(" + Group2 + ")";
Pattern p = Pattern.compile(StrRegExp);
CharSequence sq = (CharSequence)toSearch;
Matcher m = p.matcher(sq);
while(m.find()) {
if((tmp = m.group(1)) != null)
System.out.println("Group 1 instantiated to: " + m.group());
}

Mvh Jesper



Kristian Thy (28-10-2003)
Kommentar
Fra : Kristian Thy


Dato : 28-10-03 13:39

Jesper Matthiesen uttered:
> Nu er det et stykke tid siden men jeg gjorde cirka noget i denne
> retning:
[snip code]

Ja, okay. Det burde virke, men jeg ville gerne bruge den lidt mere
elegante String.replaceAll() uden at skulle eksplicit compile patterns
og matche etc.

\\kristian
--
Give a man a match, and he'll be warm for a minute.
Set him on fire, and he'll be warm for the rest of his life.

Kurt Kjær Jensen (28-10-2003)
Kommentar
Fra : Kurt Kjær Jensen


Dato : 28-10-03 17:48

Kristian Thy wrote:
> Jesper Matthiesen uttered:
>
>>Nu er det et stykke tid siden men jeg gjorde cirka noget i denne
>>retning:
>
> [snip code]
>
> Ja, okay. Det burde virke, men jeg ville gerne bruge den lidt mere
> elegante String.replaceAll() uden at skulle eksplicit compile patterns
> og matche etc.

Grupperne refereres med $0 til $9, check evt. følgende:
http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Matcher.html


--
Vh Kurt http://www.aub.dk/~kkjen


Kristian Thy (29-10-2003)
Kommentar
Fra : Kristian Thy


Dato : 29-10-03 00:40

Kurt Kjær Jensen uttered:
> Grupperne refereres med $0 til $9...

You're my hero! Jeg havde overset at der skulle $ foran og ikke \

\\kristian
--
"The ability to enslave a planet is insignificant
next to the power of the Macintosh" --Darth Vader

Søg
Reklame
Statistik
Spørgsmål : 177513
Tips : 31968
Nyheder : 719565
Indlæg : 6408602
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste