prosím nějakého dobrodince - jak jste řešili hledání pomocí masky? Hnětynka mi mojí (očividně špatnou, to jsem po zpětném pohledu musel uznat) verzi vrátil a ať teď zkouším co zkouším, tak to pokaždý na některej případ nefunguje...
edit : pokud by někdo nedělal tenhle příklad, ale uměl by třeba poradit - přesné znění je : procházet názvy souborů a porovnávat s maskou, kde "*" znamená libovlný počet jakýchkoliv znaků a "?" libovolný jeden znak...zkoušel jsem to různě převádět na regexpy, ale ty mi bohužel moc nejdou, takže ve výsledku to nikdy nefunguje pořádně
2. domácí úkol - FIND
- Oscar
- Donátor
- Příspěvky: 26
- Registrován: 13. 11. 2004 13:52
- Typ studia: Informatika Mgr.
- Kontaktovat uživatele:
Re: 2. domácí úkol - FIND
zatial som ulohu nerobil, ale myslim si, ze previest * a ? na regexp je iba o pridani bodky pred. Teda regexp ".*" matchuje lubovolny (aj nulovy) pocet lubovolnych znakov (to je ta bodka) a otaznik znamena, ze ten lubovolny znak tam moze alebo nemusi byt. keby si chcel mat ? striktne jeden znak, tak by sa tam mala dat len bodka "." (akoze jeden lubovolny znak). Neviem ale ako tie regexpy funguju v Jave, ale myslim ze by to malo byt rovnako ako ine regexpy.
Vela stastia...
Vela stastia...
- Ellrohir
- Matfyz(ák|ačka) level III
- Příspěvky: 140
- Registrován: 21. 12. 2007 13:29
- Typ studia: Informatika Bc.
- Login do SIS: secka7am
- Bydliště: Praha
- Kontaktovat uživatele:
Re: 2. domácí úkol - FIND
no už jsem to udělal jiným způsobem, ale to, co říkáš podle mě není úplně dobrá cesta...protože bys pak musel nějak ohlídat oescapování všech ostatních potenciálních částí regulárního výrazu v původní masce (třeba kdyby tam bylo "[a-z]"), jinak by je java funkce String.match(String regexp) chtěla zmatchovat taky...aspoň myslím...
každopádně já jsem nakonec udělal tohle řešení, které se zdá být funkční, i když je trochu delší :
každopádně já jsem nakonec udělal tohle řešení, které se zdá být funkční, i když je trochu delší :
Kód: Vybrat vše
public static boolean matcher(String mask, String word) {
if (mask.length() == 0) // nothing more in mask - means the rest of the word will defintely match
{
if (word.length()>0)
return false; // still some chars in word - no match
else
return true; // match of mask and word
}
// standard matching
boolean match = true; // lets presume...
// check the first char of mask
if (mask.charAt(0) == '*') {
// remove this '*' from mask
// remove letters from word, until matcher calling returns true
String newWord = word;
while (!matcher(mask.substring(1), newWord)&&(newWord.length()>0))
{
newWord = newWord.substring(1);
}
// call function again for new mask and word version
match = matcher(mask.substring(1), newWord);
} else if (mask.charAt(0) == '?') {
if (word.length() > 0) {
// remove this '?' from mask
// delete first chsr in word - stands for this '?'
// call function again for new mask and word version
match = matcher(mask.substring(1), word.substring(1));
} else {
// word is too short so it cannot match
match = false;
}
} else {
if (word.length() > 0) {
// match to some sub-string
// first - get the position of next '*' or '?' in mask
int bound1 = mask.indexOf('*');
int bound2 = mask.indexOf('?');
int bound = -1;
if ((bound1>-1)&&(bound2>-1))
{
if (bound1<=bound2)
bound = bound1;
else
bound = bound2;
}
else
{
if (bound1>-1)
bound = bound1;
else if (bound2>-1)
bound = bound2;
}
// now create sub-string we will be matching
String subMask;
if (bound > -1) {
subMask = mask.substring(0, bound);
} else {
subMask = mask;
}
// match with word
if (word.indexOf(subMask) == 0) {
// remove this subMask from mask
// delete subMask from word
// call function again for new mask and word version
match = matcher(mask.substring(subMask.length()), word.substring(word.indexOf(subMask) + subMask.length()));
} else {
// no match
match = false;
}
} else {
// word is too short so it cannot match
match = false;
}
}
// finally return what we get
return match;
}
- hippies
- Admin(ka) level I
- Příspěvky: 990
- Registrován: 29. 9. 2004 12:46
- Typ studia: Informatika Mgr.
- Login do SIS: procj4am
- Bydliště: Mladá Boleslav
- Kontaktovat uživatele:
Re: 2. domácí úkol - FIND
Oescapovat prece neni zadna prace. Das cyklus pres vsechny znaky a kdyz je nebezpecny, das pred nej \, ([,],.,atd) a pri te prilezitosti udelas tu substituci co popsal Oscar.
Chjo, dovede te si představit svět, kde by byla každá harmonická diferenciální forma (jistého typu) nesingulární projektivní algebraické variety racionální kombinací kohomologických tříd algebraických cyklů..
- Ellrohir
- Matfyz(ák|ačka) level III
- Příspěvky: 140
- Registrován: 21. 12. 2007 13:29
- Typ studia: Informatika Bc.
- Login do SIS: secka7am
- Bydliště: Praha
- Kontaktovat uživatele:
Re: 2. domácí úkol - FIND
njn...škoda žes mi to nenapsal dřív, než jsem v potu tváře napsal to svoje
když mi tady nikdo neodpovídal, tak jsem se na to ptal na chatu našeho softballovýho klubu "MFF Neratovice" a tam mě jednak ta větší polovina, která jméno "MFF" nosí už dávno jenom proto, že to "dobře zní" vypískala, cože jim to cpu do chatu za nesmysly a ta menší polovina ještě přežívajících skutečných matfyzáků mi poradila ten postup, co jsem uplatnil...
když mi tady nikdo neodpovídal, tak jsem se na to ptal na chatu našeho softballovýho klubu "MFF Neratovice" a tam mě jednak ta větší polovina, která jméno "MFF" nosí už dávno jenom proto, že to "dobře zní" vypískala, cože jim to cpu do chatu za nesmysly a ta menší polovina ještě přežívajících skutečných matfyzáků mi poradila ten postup, co jsem uplatnil...
- hippies
- Admin(ka) level I
- Příspěvky: 990
- Registrován: 29. 9. 2004 12:46
- Typ studia: Informatika Mgr.
- Login do SIS: procj4am
- Bydliště: Mladá Boleslav
- Kontaktovat uživatele:
Re: 2. domácí úkol - FIND
prislo mi to tak banalni, ze jsem myslel, ze v tom bylo neco zaludnejsiho;) (/me a Java nejdou dohromady)
A na rychly odpovedi doporucuju #mff.cuni na irc.quakenet.org
A na rychly odpovedi doporucuju #mff.cuni na irc.quakenet.org
Chjo, dovede te si představit svět, kde by byla každá harmonická diferenciální forma (jistého typu) nesingulární projektivní algebraické variety racionální kombinací kohomologických tříd algebraických cyklů..