regexp woorden filteren

Pagina: 1
Acties:

  • Krooswijk.com
  • Registratie: Mei 2000
  • Laatst online: 17-08-2024
ik kom niet helemaal uit een reguliere expressie

ik wil in Java mbv de String.replaceAll functie woorden uit een comma spatie separated string filteren die korter zijn dan b.v. 3 letters.

Hiervoor de volgende test in een JSP:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
String regExp, pStr;

// invoer
pStr = "ddd dbfjh4b ddd dd jh4434 dd dfgdf dfg aaa naar jjj kkk lll fff bdda";
out.println( pStr + "<BR>" );

// begin en eind
regExp = "^.{1,3}\\s";
pStr = pStr.replaceAll( regExp, "" );

regExp = "\\s.{1,3}$";
pStr = pStr.replaceAll( regExp, "" );

// midden (elk tweede woord van lengte 3 of korter blijft staan)
regExp = "\\s.{1,3}\\s";
pStr = pStr.replaceAll( regExp, " " );

// resultaat
out.println( pStr );

// Output:dbfjh4b dd jh4434 dfgdf aaa naar kkk fff bdda



Nu zie ik echter dat in het midden gedeelte, als er twee woorden achter elkaar voorkomen, kleiner of gelijk aan 3 letters, dan wordt alleen het eerste woord eruit gefilterd. Nu weet ik niet precies hoe de string geparsed wordt. Ik dacht door er een extra spatie terug te zetten, dat het volgende woord automatisch ook gefilterd werd. Iemand een suggestie?

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10 08:18
niet helemaal ontopic:

je comma separated string is spatie separated :|

waarom trouwens niet gewoon spatie voor en na je string zetten en dan 1x een regex uitvoeren? (en eventueel dan de spaties er weer af halen)
dit lijkt me sneller dan 3x een regex

This message was sent on 100% recyclable electrons.


  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 16:28

DataGhost

iPL dev

Hou ook rekening met het feit dat een . ook een spatie matcht. Als je de substring "ddd dd jh4434" van hierboven neemt, match je eerst .{1,3} (is greedy!!) -> ddd en daarna match je de spatie. Je engine zegt dan van 'hee we hebben een match' en vervangt deze. Vervolgens ga je in "dd jh4434" weer .{1,3} (nog steeds greedy) matchen, dat matcht "dd ". Daarna wil je een spatie matchen, maar het volgende teken is een j. Er is dan geen match en er wordt dus niks replaced. Ik zou dus in plaats van "." matchen op "[a-zA-Z0-9]" of beter nog, op "[^\s]".

Je kan ook overwegen om iets met word boundaries (\w en/of \W \b en/of \B) of word-characters (\w en/of \W) te doen, maar daar heb ik nooit mee gewerkt dus ik ken de mogelijkheden er niet 100% van. Het blijft toch het beste om met deze nieuwe informatie nog eens goed te kijken naar wat je regexes eigenlijk doen en eventueel man perlre te raadplegen.

[ Voor 28% gewijzigd door DataGhost op 04-07-2007 14:12 ]