Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Проблемы с регуляркой


Автор: yuliadubinina 24.5.2013, 13:48
Почему следующая регулярка
Код

(.*[^\da-zA-Z]+rebase[^\da-zA-Z]+.*)|(^rebase[^\da-zA-Z]+.*)|(.*[^\da-zA-Z]+rebase$)|(^rebase$)

возвращает false на matches() не смотря на присутствие <A HREF=/rebase/rebase.seqs.html> в

<HTML><HEAD><TITLE>REBASE Sequence Data</TITLE></HEAD> <!--========================================================--> <!--== Dana Macelis for Dr. R.J. Roberts ======--> <!--========================================================--> <BODY BGCOLOR=#FFFFFF TEXT=#000000 LINK=#000080 ALINK=#5577CC VLINK=#5577CC> <CENTER> <TABLE WIDTH=100%><TR ALIGN=CENTER VALIGN=CENTER> <TD><A HREF=/rebase/index.html><IMG SRC=/rebase/rebhomeB4.gif BORDER=0 ALT=Home></A></TD> <TD> <FONT SIZE=5><b>REBASE <font color=#5599BB>Sequence Data</font></b></FONT> 06/22/2011<br> <font size=2 color=gray>DNA and Protein sequences are shown in <font color=#77AADD><b>FASTA</b></font> Format.</font> <br><table cellpadding=6><tr> <td bgcolor=#99FF99><a href=javascript:window.close();><font size=2 color=#000000>Close Window</font></a></td><td bgcolor=#FFFF99><a href=javascript:history.go(-1);><font size=2 color=#000000>Back</font></a></td> <td bgcolor=lightyellow><a href=javascript:history.go();><font size=2 color=#000000>Refresh</font></a></td> </tr></table> </TD> <TD><A HREF=/rebase/rebase.seqs.html><IMG SRC=/rebase/rebseqs.gif BORDER=0 ALT=Seqs></A></TD> </TR></TABLE> <br><br> <table><tr><td align=left><b><FONT size=3><xmp> >M.EcoCB9615DamP GATC 278 aa MKKNRAFLKW AGGKYPLLDD IKRHLPKGEC LVEPFVGAGS VFLNTDFSRY ILADINSDLI SLYNIVKMRT DEYVQAAREL FVPETNCAEV YYQFREEFNK SQDPFRRAVL FLYLNRYGYN GLCRYNLRGE FNVPFGRYKK PYFPEAELYH FAEKAQNAFF YCESYADSMA RADDASVVYC DPPYAPLSAT ANFTAYHTNS FTLEQQAHLA EIAEGLVERH IPVLISNHDT MLTREWYQRA KLHVVKVRRS ISSNGGTRKK VDELLALYKP GVVSPAKK </xmp></font></b></td></tr></table><hr> </CENTER> </BODY> </HTML>


Автор: yuliadubinina 24.5.2013, 15:54
Выяснилось, что если скопипастить html код с этого форума, то регулярка работает. Если брать контент вот этой страницы http://rebase.neb.com/cgi-bin/seqsget?M.EcoCB9615DamP.CP001846.pro и копипастить его в debug из variables, то не работает. Не знаю почему  smile 

Автор: yuliadubinina 25.5.2013, 14:45
Нужно найти слово rebase в тексте html страницы в любом месте. Для этого используется регулярка, которая на matches() отдает false, не смотря на то, что rebase в тексте страницы есть. Здесь в прицепе пример данных, на которых эта регулярка не работает. И пример кода, который эту регулярку запускает. Не могу пока понять почему так происходит
Код

private static String readString(String filename) throws IOException, FileNotFoundException {
        FileInputStream fis = new FileInputStream(filename);
        byte[] bytes = new byte[10000];
        byte[] buffer = new byte[10000];
        int n;
        int offset = 0;
        while ((n = fis.read(buffer)) > 0) {
            for (int i = 0; i < n; i++) {
                bytes[i + offset] = buffer[i];
            }
            offset += n;
        }
        fis.close();
        String content = new String(bytes, 0, offset);
        return content;
    }

public static void main(String[] args) throws Exception {
        String content = readString("teststring");
        System.out.println(content);
        String host = readString("testhost");

        String[] parts = host.split("\\.");

        for (String part : parts) {
            if (part.length() < 4) {
                continue;
            }
//            System.out.println(part+" "+content.matches("(.*[^\\da-zA-Z]+" + part + "[^\\da-zA-Z]+.*)"
//                    + "|(^" + part + "[^\\da-zA-Z]+.*)"
//                    + "|(.*[^\\da-zA-Z]+" + part + "$)"
//                    + "|(^" + part + "$)"));
            System.out.println(part + " " + content.matches("(^|.*[^\\da-zA-Z]+)" + part + "([^\\da-zA-Z]+.*|$)"));
        }
    }

Автор: Pawl 25.5.2013, 17:09
может я не понял ТЗ, но для ответа, содержится ли слово в строке, регулярка не нужна.если вместо
Код

System.out.println(part + " " + content.matches("(^|.*[^\\da-zA-Z]+)" + part + "([^\\da-zA-Z]+.*|$)"));

написать
Код

System.out.println(part + " " + content.contains(part));

результат будет
Код

...
rebase true

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)