قمزة الخطأ: java.util.regex.patterntsyntaxexception، تتدلى metacharacter '*'

StackOverflow https://stackoverflow.com/questions/917822

  •  06-09-2019
  •  | 
  •  

سؤال

انا استخدم split() لتكييس سلسلة مفصولة مع * بعد هذا التنسيق:

name*lastName*ID*school*age
%
name*lastName*ID*school*age
%
name*lastName*ID*school*age

أنا أقرأ هذا من ملف باسم "entrada.al" باستخدام هذا الرمز:

static void leer() {

    try {
        String ruta="entrada.al";
        File myFile = new File (ruta);
        FileReader fileReader = new FileReader(myFile);

        BufferedReader reader = new BufferedReader(fileReader);

        String line = null;

        while ((line=reader.readLine())!=null){
            if (!(line.equals("%"))){
                String [] separado = line.split("*"); //SPLIT CALL
                names.add(separado[0]);
                lastNames.add(separado[1]);
                ids.add(separado[2]);
                ages.add(separado[3]);
            }
        }

        reader.close();
    }

وأنا أحصل على هذا الاستثناء:

استثناء في موضوع "Main" java.util.regex.patterntsyntaxexception: Tevling Meta Character '*' Near Index 0 *

تخميني هو عدم وجود * بعد العمر على الملف النصي الأصلي يسبب هذا. كيف يمكنني الحصول على حولها؟

هل كانت مفيدة؟

المحلول

لا، المشكلة هي أن * هي شخصية محجوزة في regexes، لذلك تحتاج إلى الهروب منه.

String [] separado = line.split("\\*");

* يعني "صفر أو أكثر من التعبير السابق" (انظر Pattern جافادوكس)، وأنت لا تعطيه أي تعبير سابق، مما يجعل التعبير المنفصل الخاص بك غير قانوني. هذا هو السبب في أن الخطأ كان PatternSyntaxException.

نصائح أخرى

كان لدي مشكلة مماثلة مع regex = "?". وبعد يحدث ذلك لجميع الأحرف الخاصة التي لها بعض المعنى في Regex. لذلك تحتاج إلى أن يكون "\\" كادئة إلى Regex الخاص بك.

String [] separado = line.split("\\*");

الإجابة الأولى تغطيها.

ايم التخمين أن في مكان ما أسفل الخط قد تقرر تخزين معلوماتك في فئة / هيكل مختلف. في هذه الحالة، ربما لن ترغب في أن تكون النتائج التي تحدث في مجموعة من الأسلوب SPLIT ().

أنت لم تسأل عن ذلك، لكنني أشعر بالملل، لذلك هنا مثال على ذلك، آمل أن يكون مفيدا.

قد يكون هذا الفصل الذي تكتبه لتمثيل شخص واحد:


class Person {
            public String firstName;
            public String lastName;
            public int id;
            public int age;

      public Person(String firstName, String lastName, int id, int age) {
         this.firstName = firstName;
         this.lastName = lastName;
         this.id = id;
         this.age = age;
      }  
      // Add 'get' and 'set' method if you want to make the attributes private rather than public.
} 

ثم، فإن إصدار رمز التحليل الذي نشرته في الأصل من شأنه أن ينظر إلى شيء مثل هذا: (هذا يخزنها في قائمة مرتبطة، يمكنك استخدام شيء آخر مثل Hashtable، إلخ.)


try 
{
    String ruta="entrada.al";
    BufferedReader reader = new BufferedReader(new FileReader(ruta));

    LinkedList<Person> list = new LinkedList<Person>();

    String line = null;         
    while ((line=reader.readLine())!=null)
    {
        if (!(line.equals("%")))
        {
            StringTokenizer st = new StringTokenizer(line, "*");
            if (st.countTokens() == 4)          
                list.add(new Person(st.nextToken(), st.nextToken(), Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken)));         
            else            
                // whatever you want to do to account for an invalid entry
                  // in your file. (not 4 '*' delimiters on a line). Or you
                  // could write the 'if' clause differently to account for it          
        }
    }
    reader.close();
}

إنه لان * يستخدم كمتعلق للدلالة على حدوث أو أكثر من الحرف السابق. لذلك إذا كتبت m * ثم ستبحث عن الملفات mmmmmm .....! هنا تستخدم * كحرف فقط حتى يبحث المحول البرمجي عن الحرف للعثور على نشطات متعددة، لذلك يرمي الاستثناء. :)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top