Tekenreeks splitsen met punt als scheidingsteken

Ik vraag me af of ik een string op een .op de juiste manier ga splitsen? Mijn code is:

String[] fn = filename.split(".");
return fn[0];

Ik heb alleen het eerste deel van de string nodig, daarom retourneer ik het eerste item. Ik vraag het omdat ik in de API heb opgemerkt dat .een willekeurig teken betekent, dus nu zit ik vast.


Antwoord 1, autoriteit 100%

split()accepteert een reguliere expressie, dus u moet .om het niet als een regex-metateken te beschouwen. Hier is een voorbeeld:

String[] fn = filename.split("\\."); 
return fn[0];

Antwoord 2, autoriteit 11%

Ik zie hier alleen oplossingen, maar geen volledige uitleg van het probleem, dus besloot ik dit antwoord te posten

Probleem

Je moet een paar dingen weten over text.split(delim). splitmethode:

  1. aanvaardt als argument reguliere expressie(regex) die het scheidingsteken beschrijft waarop we willen splitsen,
  2. als delimbestaat aan het einde van textzoals in a,b,c,,(waar het scheidingsteken ,) splitzal eerst een array maken zoals ["a" "b" "c" "" ""]maar aangezien we in de meeste gevallen niet echt nodig hebben deze achterblijvende lege strings verwijdert het ze ook automatisch voor ons. Dus het creëert een andere array zonder deze lege strings en geeft deze terug.

Je moet ook weten dat punt .is speciaal tekenin regex. Het vertegenwoordigt elk teken(behalve regelscheidingstekens, maar dit kan worden gewijzigd met de vlag Pattern.DOTALL).

Dus voor strings zoals "abc"als we splitsen op "."splitmethode zal

  1. maak een array aan zoals ["" "" "" ""],
  2. maar aangezien deze array alleen lege strings bevat en ze allemaal achteraan staan, zullen ze worden verwijderd (zoals getoond in het vorige tweede punt)

wat betekent dat we als resultaat een lege array []krijgen (zonder elementen, zelfs geen lege string), dus we kunnen fn[0]niet gebruiken omdat er is geen index 0.

Oplossing

Om dit probleem op te lossen, hoeft u alleen maar een regex te maken die een punt vertegenwoordigt. Om dit te doen, moeten we ontsnappen aan die .. Er zijn weinig manieren om dit te doen, maar de eenvoudigste is waarschijnlijk door \te gebruiken (die in String moet worden geschreven als "\\"omdat \is daar ook speciaal en vereist een andere \om te escapen).

Dus de oplossing voor uw probleem kan er als volgt uitzien

String[] fn = filename.split("\\.");

Bonus

Je kunt ook andere manieren gebruiken om aan die stip te ontsnappen, zoals

  • met tekenklasse split("[.]")
  • in aanhalingstekensplit("\\Q.\\E")
  • de juiste Pattern-instantie gebruiken met de vlag Pattern.LITERAL
  • of gebruik gewoon split(Pattern.quote("."))en laat regex het escapen voor je doen.

Antwoord 3, autoriteit 9%

Split gebruikt reguliere expressies, waarbij ‘.’ is een speciaal teken dat iets betekent. Je moet er aan ontsnappen als je echt wilt dat het overeenkomt met de ‘.’ karakter:

String[] fn = filename.split("\\.");

(een ‘\’ om te ontsnappen aan de ‘.’ in de reguliere expressie, en de andere om te ontsnappen aan de eerste in de Java-tekenreeks)

Ik zou ook niet aanraden om fn[0] terug te geven, want als je een bestand hebt met de naam something.blabla.txt, wat een geldige naam is, zul je niet de daadwerkelijke bestandsnaam teruggeven. In plaats daarvan denk ik dat het beter is als je het volgende gebruikt:

int idx = filename.lastIndexOf('.');
return filename.subString(0, idx);

Antwoord 4, autoriteit 8%

de methode String#split(String) gebruikt reguliere expressies.
In reguliere expressies wordt de “.” karakter betekent “elk teken”.
U kunt dit gedrag voorkomen door de “.”

filename.split("\\.");

of de split-methode vertellen om te splitsen bij een tekenklasse:

filename.split("[.]");

Tekenklassen zijn verzamelingen tekens. Je zou kunnen schrijven

filename.split("[-.;ld7]");

en bestandsnaam worden gesplitst bij elke “-“, “.”, “;”, “l”, “d” of “7”. Binnen karakterklassen, de “.” is geen speciaal teken (“metateken”).


Antwoord 5, autoriteit 4%

Omdat DOT( . ) wordt beschouwd als een speciaal teken en de split-methode van String een reguliere expressie verwacht, moet je dit als volgt doen –

String[] fn = filename.split("\\."); 
return fn[0];

In Java moeten de speciale tekens worden geëscaped met een “\” maar aangezien “\” ook een speciaal teken is in Java, moet u er opnieuw een escape van geven met een andere “\”!


Antwoord 6, autoriteit 3%

String str="1.2.3";
String[] cats = str.split(Pattern.quote("."));

Antwoord 7, autoriteit 2%

Zou het niet efficiënter zijn om te gebruiken

filename.substring(0, filename.indexOf("."))

Als je alleen wilt wat er aan de hand is met de eerste stip?


Antwoord 8

Meestal is het GEEN goed idee om het met de hand te ontmaskeren. Er is een methode in de klasse Pattern voor deze taak:

java.util.regex
static String quote(String s) 

Antwoord 9

De splitsing moet regex als argument nemen… Verander gewoon "."in "\\."


Antwoord 10

Opmerking: wees extra voorzichtig met dit fragment, zelfs nadat de punt is ontsnapt!

Als bestandsnaam alleen de tekenreeks “.” is, zal fn nog steeds een lengte van 0 hebben en zal fn[0] nog steeds een uitzondering genereren!

Dit is zo, want als het patroon minstens één keer overeenkomt, zal split alle lege tekenreeksen achteraan weggooien(dus ook die vóórde punt!) uit de array , waardoor een lege array overblijft die moet worden geretourneerd.


Antwoord 11

De oplossing die voor mij werkte, is de volgende

bestandsnaam.split(“[.]”);


Antwoord 12

Het gebruik van ApacheCommonsis het eenvoudigst:

File file = ...
FilenameUtils.getBaseName(file.getName());

Let op, het extraheert ook een bestandsnaam van het volledige pad.


Antwoord 13

splitneemt een regex als argument. U moet dus "\."doorgeven in plaats van "."omdat "."een metakarakter is in regex.

Other episodes