una son separar salto por parte palabra manejo los linea letras extraer ejercicios delimitadores cuales caracter cadenas cadena java string split

son - ¿Cómo puedo usar "." Como el delimitador con String.split() en Java



split java netbeans (8)

¿Has intentado escapar del punto? Me gusta esto:

String[] words = line.split("//.");

Lo que intento hacer es leer un archivo .java, seleccionar todos los identificadores y almacenarlos en una lista. Mi problema es con el método .split (). Si ejecuta este código como está, obtendrá ArrayOutOfBounds, pero si cambia el delimitador de "." para cualquier otra cosa, el código funciona. Pero necesito líneas analizadas por "." Entonces, ¿hay otra manera de que pueda lograr esto?

import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.*; public class MyHash { private static String[] reserved = new String[100]; private static List list = new LinkedList(); private static List list2 = new LinkedList(); public static void main (String args[]){ Hashtable hashtable = new Hashtable(997); makeReserved(); readFile(); String line; ListIterator itr = list.listIterator(); int listIndex = 0; while (listIndex < list.size()) { if (itr.hasNext()){ line = itr.next().toString(); //PROBLEM IS HERE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! String[] words = line.split("."); //CHANGE THIS AND IT WILL WORK System.out.println(words[0]); //TESTING TO SEE IF IT WORKED } listIndex++; } } public static void readFile() { String text; String[] words; BufferedReader in = null; try { in = new BufferedReader(new FileReader("MyHash.java")); //NAME OF INPUT FILE } catch (FileNotFoundException ex) { Logger.getLogger(MyHash.class.getName()).log(Level.SEVERE, null, ex); } try { while ((text = in.readLine()) != null){ text = text.trim(); words = text.split("//s+"); for (int i = 0; i < words.length; i++){ list.add(words[i]); } for (int j = 0; j < reserved.length; j++){ if (list.contains(reserved[j])){ list.remove(reserved[j]); } } } } catch (IOException ex) { Logger.getLogger(MyHash.class.getName()).log(Level.SEVERE, null, ex); } try { in.close(); } catch (IOException ex) { Logger.getLogger(MyHash.class.getName()).log(Level.SEVERE, null, ex); } } public static int keyIt (int x) { int key = x % 997; return key; } public static int horner (String word){ int length = word.length(); char[] letters = new char[length]; for (int i = 0; i < length; i++){ letters[i]=word.charAt(i); } char[] alphabet = new char[26]; String abc = "abcdefghijklmnopqrstuvwxyz"; for (int i = 0; i < 26; i++){ alphabet[i]=abc.charAt(i); } int[] numbers = new int[length]; int place = 0; for (int i = 0; i < length; i++){ for (int j = 0; j < 26; j++){ if (alphabet[j]==letters[i]){ numbers[place]=j+1; place++; } } } int hornered = numbers[0] * 32; for (int i = 1; i < numbers.length; i++){ hornered += numbers[i]; if (i == numbers.length -1){ return hornered; } hornered = hornered % 997; hornered *= 32; } return hornered; } public static String[] makeReserved (){ reserved[0] = "abstract"; reserved[1] = "assert"; reserved[2] = "boolean"; reserved[3] = "break"; reserved[4] = "byte"; reserved[5] = "case"; reserved[6] = "catch"; reserved[7] = "char"; reserved[8] = "class"; reserved[9] = "const"; reserved[10] = "continue"; reserved[11] = "default"; reserved[12] = "do"; reserved[13] = "double"; reserved[14] = "else"; reserved[15] = "enum"; reserved[16] = "extends"; reserved[17] = "false"; reserved[18] = "final"; reserved[19] = "finally"; reserved[20] = "float"; reserved[21] = "for"; reserved[22] = "goto"; reserved[23] = "if"; reserved[24] = "implements"; reserved[25] = "import"; reserved[26] = "instanceof"; reserved[27] = "int"; reserved[28] = "interface"; reserved[29] = "long"; reserved[30] = "native"; reserved[31] = "new"; reserved[32] = "null"; reserved[33] = "package"; reserved[34] = "private"; reserved[35] = "protected"; reserved[36] = "public"; reserved[37] = "return"; reserved[38] = "short"; reserved[39] = "static"; reserved[40] = "strictfp"; reserved[41] = "super"; reserved[42] = "switch"; reserved[43] = "synchronize"; reserved[44] = "this"; reserved[45] = "throw"; reserved[46] = "throws"; reserved[47] = "trasient"; reserved[48] = "true"; reserved[49] = "try"; reserved[50] = "void"; reserved[51] = "volatile"; reserved[52] = "while"; reserved[53] = "="; reserved[54] = "=="; reserved[55] = "!="; reserved[56] = "+"; reserved[57] = "-"; reserved[58] = "*"; reserved[59] = "/"; reserved[60] = "{"; reserved[61] = "}"; return reserved; } }


Al dividir con un delimitador literal de cadena, la forma más segura es utilizar el método Pattern.quote() :

String[] words = line.split(Pattern.quote("."));

Como se describe en otras respuestas, dividir con "//." es correcto, pero quote() hará esto escapando por ti.


El argumento para dividir es una expresión regular. "." coincide con cualquier cosa por lo que su delimitador para dividir es cualquier cosa.


El argumento para dividir es una expresión regular. El período es un metacarácter de expresión regular que coincide con cualquier cosa, por lo que cada carácter en line se considera un carácter dividido, y se descarta, y todas las cadenas vacías entre ellos se descartan (porque son cadenas vacías). El resultado es que no te queda nada.

Si escapa del período (al agregar una barra invertida escapada antes), puede hacer coincidir períodos literales. ( line.split("//.") )


Es posible que le interese la clase StringTokenizer . Sin embargo, los documentos java le aconsejan que use el método .split ya que StringTokenizer es una clase heredada.


Esta definitivamente no es la mejor manera de hacerlo, pero lo hice haciendo algo así como seguir.

String imageName = "my_image.png"; String replace = imageName.replace(''.'',''~''); String[] split = replace.split("~"); System.out.println("Image name : " + split[0]); System.out.println("Image extension : " + split[1]);

Salida,

Image name : my_image Image extension : png


Si el rendimiento es un problema, debe considerar utilizar StringTokenizer lugar de split . StringTokenizer es mucho más rápido que split , aunque es una clase "heredada" (pero no desaprobada).


String.split toma una expresión regular, y ''.'' tiene un significado especial para regexes.

Usted (probablemente) quiere algo como:

String[] words = line.split("//.");

Algunas personas parecen estar teniendo problemas para hacer que esto funcione, así que aquí hay un código ejecutable que puedes usar para verificar el comportamiento correcto.

import java.util.Arrays; public class TestSplit { public static void main(String[] args) { String line = "aa.bb.cc.dd"; String[] words = line.split("//."); System.out.println(Arrays.toString(words)); // Output is "[aa, bb, cc, dd]" } }