[Java] stukken uit een string filteren?

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • BramCoding
  • Registratie: Maart 2016
  • Laatst online: 03-10 15:43
Hallo,

ik zit eventjes vast bij een String filtering. Ik heb volgende string:

code:
1
String myString = "(&(osgi.wiring.bundle=org.bram.demo)(&(version>=0.13.17)(version<0.14.0)))"


Dit is slechts 1 voorbeeld van hoe deze string eruit kan zien. De ene keer is dit dus deze "osgi.wiring.bundle', de andere keer kan door staan "osgi.wiring.package". Ik kan dus met andere woorden niet hardcoderen dat hij daarop een match zoekt.

Ik wil nu een search uitvoeren in deze string, die telkens de nuttige informatie teruggeven in een bepaalde structuur. Ik wou dit eerst in een Map doen maar aangezien daar geen duplicate keys in mogen zit ik wat vast.

Vraag1: Hoe zou ik kunnen searchen (niet hardcoded) in deze string zodat ik telkens de nuttige informatie terug krijg:
  • osgi.wiring.bundle=org.bram.demo
  • version>=0.13.17
  • version<0.14.0
Ik probeerde al wat te spelen met String.indexOf("(") maar dan krijg ik gewoon de index terug van de eerste "(".

Vraag2: In welke collection zou dit best gestoken worden? Ik dacht zelf om ze misschien na elkaar te lijsten in een lijst en dan elk lijstitem zelf te gaan verwerken.

Alvast bedankt voor de eventuele hulp!

Alle reacties


Acties:
  • +2 Henk 'm!

  • Matszs
  • Registratie: Juli 2010
  • Laatst online: 21:06

Matszs

><>

Regular Expression (RegEx) is wat je zoekt! https://www.tutorialspoin...regex_pattern_compile.htm

Acties:
  • +1 Henk 'm!

  • Glashelder
  • Registratie: September 2002
  • Niet online

Glashelder

Anti Android

offtopic:
No offence, maar denk je nou écht dat de TS nog nóóit van regular expressions gehoord heeft?


Doe eens een opzet dan..

PV 4915wp op oost, 2680 wp op west, 1900 wp op zuid. pvoutput - AUX 8 kW bi bloc


Acties:
  • +1 Henk 'm!

  • mathias82
  • Registratie: April 2017
  • Laatst online: 18-09 10:24
Vraag 1: Kijk eens naar https://docs.oracle.com/j...l#split(java.lang.String) in combinatie met regular expressions zoals @Matszs al aangaf (https://www.regular-expressions.info/quickstart.html voor meer info).

Vraag 2: Best een Map<String, List<String>>

Acties:
  • 0 Henk 'm!

  • BramCoding
  • Registratie: Maart 2016
  • Laatst online: 03-10 15:43
mathias82 schreef op woensdag 1 mei 2019 @ 20:14:
Vraag 1: Kijk eens naar https://docs.oracle.com/j...l#split(java.lang.String) in combinatie met regular expressions zoals @Matszs al aangaf (https://www.regular-expressions.info/quickstart.html voor meer info).

Vraag 2: Best een Map<String, List<String>>
Maar ik heb 2 keer "version", dus die kan niet gebruikt worden als key in de Map (vanwege duplicate keys)?

Acties:
  • 0 Henk 'm!

  • BramCoding
  • Registratie: Maart 2016
  • Laatst online: 03-10 15:43
Ik bekijk het even! Thanks

Acties:
  • 0 Henk 'm!

  • mathias82
  • Registratie: April 2017
  • Laatst online: 18-09 10:24
BramVanha schreef op woensdag 1 mei 2019 @ 20:20:
[...]


Maar ik heb 2 keer "version", dus die kan niet gebruikt worden als key in de Map (vanwege duplicate keys)?
Jawel, maar onder de key "version" zit dan een List waarin je meerdere waardes kan steken voor die key

Acties:
  • 0 Henk 'm!

  • BramCoding
  • Registratie: Maart 2016
  • Laatst online: 03-10 15:43
mathias82 schreef op woensdag 1 mei 2019 @ 20:23:
[...]


Jawel, maar onder de key "version" zit dan een List waarin je meerdere waardes kan steken voor die key
Zo, ben mee. Dan hoef ik enkel zelf op te vangen dat er controle uitgevoerd wordt naar meerdere keren hetzelfde keyword, en indien dat zo is ipv toevoegen in de Map, toevoegen in de value van de Map (List<String>) waar de key gelijk is aan "version"?

Acties:
  • 0 Henk 'm!

  • mathias82
  • Registratie: April 2017
  • Laatst online: 18-09 10:24
BramVanha schreef op woensdag 1 mei 2019 @ 20:27:
[...]


Zo, ben mee. Dan hoef ik enkel zelf op te vangen dat er controle uitgevoerd wordt naar meerdere keren hetzelfde keyword, en indien dat zo is ipv toevoegen in de Map, toevoegen in de value van de Map (List<String>) waar de key gelijk is aan "version"?
Nee, er gaat altijd een List in de Map zitten, ongeacht of de key nu 1 of 100 keer voorkomt. Er zullen dus lijsten in de Map zitten waar maar 1 waarde inzit.
Je zal zoiets moeten doen:

code:
1
2
3
4
5
6
7
8
String key = ...
String value = ...
List<String> values = map.get(key);
if(values == null) {
 values = new ArrayList<String>();
 map.put(key, values);
}
values.add(value);


PS1: Ik weet niet of dit de beste data-structuur is, dat hangt van de vraagstelling af. Dit is gewoon EEN mogelijkheid.
PS2: weet niet of dit huiswerk is en wat het beleid van Tweakers daaromtrent is...

[ Voor 6% gewijzigd door mathias82 op 01-05-2019 20:37 ]


Acties:
  • +1 Henk 'm!

  • BramCoding
  • Registratie: Maart 2016
  • Laatst online: 03-10 15:43
mathias82 schreef op woensdag 1 mei 2019 @ 20:36:
[...]


Nee, er gaat altijd een List in de Map zitten, ongeacht of de key nu 1 of 100 keer voorkomt. Er zullen dus lijsten in de Map zitten waar maar 1 waarde inzit.
Je zal zoiets moeten doen:

code:
1
2
3
4
5
6
7
8
String key = ...
String value = ...
List<String> values = map.get(key);
if(values == null) {
 values = new ArrayList<String>();
 map.put(key, values);
}
values.add(value);


PS1: Ik weet niet of dit de beste data-structuur is, dat hangt van de vraagstelling af. Dit is gewoon EEN mogelijkheid.
PS2: weet niet of dit huiswerk is en wat het beleid van Tweakers daaromtrent is...
Dit is voor een opdracht, maar slechts een heel klein deeltje (waar ik dus op vast liep). Bedankt voor de hulp!

Acties:
  • 0 Henk 'm!

  • msentinelb
  • Registratie: Juli 2002
  • Laatst online: 28-09 22:17

msentinelb

Arghhhhh!

Onderstaande regex lijkt bij mij prima te werken.
/\(&\((.*=.*)\)\(&\((version.*)\)\((version.*)\)\)\)/g

Test hem hier: https://regexr.com/4d9a7

Specs van mijn bak Hier!


Acties:
  • 0 Henk 'm!

  • Feanathiel
  • Registratie: Juni 2007
  • Niet online

Feanathiel

Cup<Coffee>

Waar komen die strings vandaan, of wie creëert ze?

Meestal is er namelijk ook wel een parser te vinden in de buurt van waar ze gemaakt worden. In dit geval valt het onder de Apache 2.0 licentie, dus wellicht kun je daar nog wat mee.

Acties:
  • 0 Henk 'm!

  • BramCoding
  • Registratie: Maart 2016
  • Laatst online: 03-10 15:43
Feanathiel schreef op donderdag 2 mei 2019 @ 19:26:
Waar komen die strings vandaan, of wie creëert ze?

Meestal is er namelijk ook wel een parser te vinden in de buurt van waar ze gemaakt worden. In dit geval valt het onder de Apache 2.0 licentie, dus wellicht kun je daar nog wat mee.
Deze komen uit een Requirement of Capability van het OSGi framework. Tot op heden nog nergens een parsen hiervoor gevonden, dus ik denk dit zelf te gaan moeten implementeren. Zou die parsen die jij aangeeft even moeten uitproberen wat daar allemaal gebeurt. Thanks voor de tip!

Acties:
  • 0 Henk 'm!

  • BramCoding
  • Registratie: Maart 2016
  • Laatst online: 03-10 15:43
msentinelb schreef op donderdag 2 mei 2019 @ 16:18:
Onderstaande regex lijkt bij mij prima te werken.
/\(&\((.*=.*)\)\(&\((version.*)\)\((version.*)\)\)\)/g

Test hem hier: https://regexr.com/4d9a7
Op het specifieke voorbeeld van mij lukt dit inderdaad zoals je aangaf, waarvoor bedankt!

Soms zitten er ook wel nog andere soortgelijke bij (dit was niet echt duidelijk in mijn openingspost maar dit was vooral omdat ik het juiste denkpad opgestuurd wou worden om dan de rest zelf uit te denken).

bvb:
(&(osgi.wiring.package=org.bram.demo)(&(version>=0.13.0)(!(version>=1.0.0))))

Door het uitroepteken werk de regex door u voorgesteld hierop niet meer. Ik zal dus proberen eentje uit te werken die in alle gevallen:
  • De haakjes moet wegwerken
  • De & moet wegwerken
  • Elke afgescheiden informatiereeks (die telkens tussen haakjes staat) apart kan onderscheiden

Acties:
  • 0 Henk 'm!

  • DaCoTa
  • Registratie: April 2002
  • Laatst online: 03-10 14:17
Ik kan me niet voorstellen dat hier geen parser voor is. Ik ken geen OSGi verder, maar iets moet dit al parsen lijkt me. In de code van Equinox moet je dit dus terug kunnen vinden.
Edit: na wat googlen lijkt het in org.osgi.framework.BundleContext#getServiceReferences te zitten, wellicht dat je daar de documentatie of de source van kunt opzoeken om te kijken hoe OSGi het zelf doet.

Rest nog de vraag: waarom heb je deze info nodig en is er geen andere bron beschikbaar voor deze informatie, als bovenstaande niet lukt?

[ Voor 28% gewijzigd door DaCoTa op 07-05-2019 01:07 ]


Acties:
  • 0 Henk 'm!

  • BramCoding
  • Registratie: Maart 2016
  • Laatst online: 03-10 15:43
DaCoTa schreef op dinsdag 7 mei 2019 @ 01:03:
Ik kan me niet voorstellen dat hier geen parser voor is. Ik ken geen OSGi verder, maar iets moet dit al parsen lijkt me. In de code van Equinox moet je dit dus terug kunnen vinden.
Edit: na wat googlen lijkt het in org.osgi.framework.BundleContext#getServiceReferences te zitten, wellicht dat je daar de documentatie of de source van kunt opzoeken om te kijken hoe OSGi het zelf doet.

Rest nog de vraag: waarom heb je deze info nodig en is er geen andere bron beschikbaar voor deze informatie, als bovenstaande niet lukt?
Ik denk niet dat ik Equinox gebruik. De enige plugin die ik installeerde voor OSGi is Bndtools (maakt het gebruiksvriendelijker om een OSGi-project te maken in Eclipse). Of gebruikt Eclipse automatisch Equinox voor OSGi?

Ik heb deze informatie nodig omdat:
-ik de Resolver handmatig wil aanspreken (en dus niet door gebruik te maken van bndtools). Daarvoor moet ik een ResolveContext aanmaken. Deze heeft een abstracte methode 'findProviders(Requirement req)' en wat deze moet doen is voor een gegeven Requirement kijken of er een Capability beschikbaar is die deze Requirement kan vervullen.

De Requirement heeft in mijn testvoorbeeld bijvoorbeeld de directives als volgt:
code:
1
"(&(osgi.wiring.bundle=org.bram.demo)(&(version>=0.13.17)(version<0.14.0)))"

of bijvoorbeeld:
code:
1
(&(osgi.wiring.package=org.bram.demo)(&(version>=0.13.0)(!(version>=1.0.0))))


Mocht je dit in XML-formaat bekijken uit een repository dan komt dit overeen met (in het eerste geval):
code:
1
2
3
<requirement namespace="osgi.wiring.bundle">
<directive name="filter" value="(&(osgi.wiring.bundle=org.bram.demo)(&(version>=0.13.17)(version<0.14.0)))"/>
</requirement>


Dit wil dus zeggen dat ik een eis stel (requirement) dat er ergens een bundle (want in mijn voorbeeld gaat het over een bundle: osgi.wiring.bundle) gehaald moet worden met de naam "org.bram.demo" en de versie moet tussen 0.13.17 en 0.14.0 liggen.

Hoe kan dit? Door een Capability (mogelijkheid, aanbod) te voorzien (ergens in een repository bijvoorbeeld) van deze bundle. Dit kan bijvoorbeeld als volgt:
code:
1
2
3
4
<capability namespace="osgi.wiring.bundle">
<attribute name="bundle-version" type="Version" value="0.13.17"/>
<attribute name="osgi.wiring.bundle" value="org.bram.demo"/>
</capability>


Nu moet de "findProviders-methode die ik al genoemd heb dus geïmplementeerd worden zodat bij eender welke Requirement die eraan wordt meegegeven, kan gekeken worden of er een Capability aanwezig is die dit kan vervullen.

Het hele zinnetje "(&(osgi.wiring.bundle=org.bram.demo)(&(version>=0.13.17)(version<0.14.0)))" kan ik ophalen uit de Requirement, maar ik moet elk deel dus apart kunnen hebben (op een generieke manier, zodat elk Requirement-zinnetje zal werken) zodat ik dit kan vergelijken tov de attributen van de Capability.

Ik weet niet of dit enigzins duidelijk is, maar daarom dus heb ik dit nodig. Voor zover ik weet kan je bij de Requirements enkel dit zinnetje ophalen en moet de findProviders-methode zelf geïmplementeerd geraken. Een parser hiervoor heb ik tot op heden nog niet gevonden, maar ik kijk wel even die org.osgi.framework.BundleContext#getServiceReferences na wat daar allemaal inzit.

EDIT: even vlug de BundleContext van mijn huidige bundle proberen te gebruiken (aangezien die automatisch aangemaakt wordt denk ik bij het aanmaken van een OSGi-project en maken van een nieuwe bundle) aan de hand van deze link:http://felix.apache.org/d...cting-bundle-context.html.
Helaas op dit moment nog zonder succes, het @Context annotation wordt niet herkend (https://gyazo.com/fc88eb419ff7ea8dc08d0dfd05fb2b8e). Er is ook geen automatische import hiervoor beschikbaar. Moet dit dus nog even dieper gaan inkijken.

[ Voor 8% gewijzigd door BramCoding op 07-05-2019 18:23 . Reden: Extra info BundleContext ]

Pagina: 1