Programim dhe zhvillim, javascript, python, php, html

Java: Modeli sillet ndryshe në Skaner

Ndodhi një sjellje të çuditshme të përputhjes regex në Java. Komanda e parë e daljes printon true siç pritej, por kur i njëjti varg paketohet në Scanner, dalja është false. Çfarë po bëj gabim?

public static void main(String[] args) {
  Pattern p = Pattern.compile(" *\\[");
  System.out.println(p.asPredicate().test("[]")); //true

  Scanner s = new Scanner("[]");
  System.out.println(s.hasNext(" *\\[")); //false
}

  • Provoni me s.hasNext(p) 05.07.2017
  • @horcrux Nga javadoc: Një thirrje e kësaj metode të formës ‹tt›hasNext(modeli)‹/tt› * sillet saktësisht në të njëjtën mënyrë si thirrja * ‹tt›hasNext(Pattern.compile(modeli)) ‹/tt›. 05.07.2017
  • @SpaceTrucker Ke të drejtë. Pra, çështja është se Pattern.compile(myRegex)p.asPredicate().test(myString) kërkon një dukuri të myRegexmyString, ndërsa new Scanner(myString).hasNext(myRegex) kontrollon nëse e gjithë përmbajtja e myString përputhet me myRegex. 05.07.2017

Përgjigjet:


1

Nga public boolean hasNext(String pattern) dokumentacioni:

Kthehet e vërtetë nëse token tjetër përputhet me modelin e ndërtuar nga vargu i specifikuar.

Këtu token tjetër është [] jo vetëm [ (pasi kufizuesi është një ose më shumë hapësira të bardha), por modeli " *\\[" nuk përputhet me atë shenjë tërësisht (] nuk përputhet) kështu që ju jeni të informuar për të nga rezultati false.

Nëse dëshironi të kontrolloni nëse token fillon me [, mund të shtoni .* në fund të modelit tuaj për ta lënë të përputhet me pjesën tjetër të tokenit. Ju gjithashtu mund të hiqni * pasi hapësira e bardhë është kufiri i paracaktuar, kështu që nuk mund të jetë pjesë e tokenit.


Në rast se

Pattern p = Pattern.compile(" *\\[");
System.out.println(p.asPredicate().test("a[]")); //true

Nëse i hidhni një sy kodit të asPredicate, do të shihni se është zbatuar si:

public Predicate<String> asPredicate() {
    return s -> matcher(s).find();
}

Metoda find() nuk kontrollon nëse i gjithë vargu përputhet me modelin, por përpiqet të gjejë edhe një pjesë të tij që përputhet me modelin. Meqenëse [] përmban zero ose më shumë hapësira të ndjekura nga [, ju po shihni true si rezultat.

05.07.2017
  • I shoh. A ekziston mundësia për të kontrolluar fillimin e një token, ose duhet të shtoj .* në fund të çdo regex? 05.07.2017
  • Këtu mënyra më e thjeshtë do të ishte shtimi i .* në fund. Por në varësi të asaj që vërtet dëshironi të arrini, ndoshta është më mirë të shmangni Skanerin dhe të përdorni Pattern drejtpërdrejt? Është e vështirë të thuash pa e ditur se çfarë vërtet dëshiron të arrish. 05.07.2017
  • Unë jam duke analizuar vargun, që përmban një grup të ngjashëm me JSON, kështu që më duhet qasje e drejtpërdrejtë te karakteret dhe një mënyrë e thjeshtë për të analizuar int ose float të plotë. A ka ndonjë alternativë ndaj Skanerit në këtë situatë. Përdorimi i analizuesit JSON nuk është një opsion, ky rast nuk mund të trajtohet në mënyrë të përgjithshme. 05.07.2017
  • @ViacheslavKroilov Nuk mund të them shumë pa parë të dhëna reale dhe rezultatet e pritura. Meqenëse kjo pyetje tashmë ka pak përgjigje për problemin e përshkruar aktualisht, nuk do të ishte mirë ta modifikonit sepse do të zhvlerësonte përgjigjet e postuara. Pra, nëse dëshironi të pyesni për rastin tuaj specifik, mendoni të krijoni një pyetje të veçantë. 05.07.2017

  • Materiale të reja

    Masterclass Coroutines: Kapitulli-3: Anulimi i korutinave dhe trajtimi i përjashtimeve.
    Mirë se vini në udhëzuesin gjithëpërfshirës mbi Kotlin Coroutines! Në këtë seri artikujsh, unë do t'ju çoj në një udhëtim magjepsës, duke filluar nga bazat dhe gradualisht duke u thelluar në..

    Faketojeni derisa ta arrini me të dhënat false
    A e gjeni ndonjëherë veten duke ndërtuar një aplikacion të ri dhe keni nevojë për të dhëna testimi që duken dhe duken më realiste ose një grup i madh të dhënash për performancën e ngarkesës...

    Si të përdorni kërkesën API në Python
    Kërkesë API në GitHub për të marrë depot e përdoruesve duke përdorur Python. Në këtë artikull, unë shpjegoj procesin hap pas hapi për të trajtuar një kërkesë API për të marrë të dhëna nga..

    Një udhëzues hap pas hapi për të zotëruar React
    Në këtë artikull, do të mësoni se si të krijoni aplikacionin React, do të mësoni se si funksionon React dhe konceptet thelbësore që duhet të dini për të ndërtuar aplikacione React. Learning..

    AI dhe Psikologjia — Pjesa 2
    Në pjesën 2 të serisë sonë të AI dhe Psikologji ne diskutojmë se si makineritë mbledhin dhe përpunojnë të dhëna për të mësuar emocione dhe ndjenja të ndryshme në mendjen e njeriut, duke ndihmuar..

    Esencialet e punës ditore të kodit tim VS
    Shtesat e mia të preferuara - Git Graph 💹 Kjo shtesë është vërtet e mahnitshme, e përdor përpara se të filloj të punoj për të kontrolluar dy herë ndryshimet dhe degët më të fundit, mund të..

    Pse Python? Zbulimi i fuqisë së gjithanshme të një gjiganti programues
    Në peizazhin gjithnjë në zhvillim të gjuhëve të programimit, Python është shfaqur si një forcë dominuese. Rritja e tij meteorike nuk është rastësi. Joshja e Python qëndron në thjeshtësinë,..