Нужна помощь по регулярному выражению Java, чтобы разбить строку, пожалуйста!Как игнорировать пустую строку? - PullRequest
0 голосов
/ 03 августа 2010

Я полный новичок в регулярных выражениях, и мне нужна помощь с разбиением строки. Я ввожу следующие данные

665  11% R     1    908K    388K  fg root     top
 61   1% S    42 152404K  29716K  fg system   system_server
 38   0% S     1    840K    340K  fg root     /system/bin/qemud
114   0% S    16 120160K  19156K  fg radio    com.android.phone

, который является ничем иным, как вашим обычным лучшим выходом. Что я намерен сделать, это выбрать на записи, как

655 11% R 1 fg root top

Теперь код, который я использую для следующего:

while ((inputLine = in.readLine()) != null) 
{
  String[] segs= inputLine.split("[ ]+");
  str[i] = segs[0]+" "+segs[1]+" "+segs[2]+" "+
           segs[3]+" "+segs[6]+" "+segs[7]+" "+segs[8];
  Log.v("TOP Output", str[i]);
  i++; j++;
}

Но проблема, с которой я сталкиваюсь, заключается в том, что я получаю на logcat

java.lang.ArrayIndexOutOfBoundsException

Где я иду не так, и что я мог сделать по-другому, чтобы предотвратить это. Спасибо за помощь.

РЕДАКТИРОВАТЬ: После прочтения комментариев я понимаю, у меня есть несколько пустых строк в моем выводе. Так что в таком случае, как я должен игнорировать эти строки. Я знаю, что должен соответствовать регистру, но не уверен насчет выражения или синтаксиса!

Ответы [ 4 ]

3 голосов
/ 03 августа 2010

Вам не нужен класс символов (квадратные скобки). Пробел является регулярным символом в регулярном выражении, поэтому:

String[] segs = inputLine.split(" +");

Кроме этого, при условии, что индексы массива есть без проверки диапазона, это плохой стиль, а ArrayIndexOutOfBoundsException - это то, что вы просили.

Лучше сделать это явно:

String re = "^\\s*(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\s+(\\S+)\\s+(\\S+)\\s*$";
Pattern p = Pattern.compile(re, Pattern.MULTILINE);
Matcher m = p.matcher(yourInputString);

while (m.find())
{
   // do stuff with m.group(1) through m.group(9)
}

Таким образом, гарантируется, что каждая строка, которую вы соответствуете, соответствует вашим ожиданиям, и каждая группа соответствия содержит то, что вы ожидаете.

Отказ от ответственности: я не особенно горжусь этим регулярным выражением. На самом деле это довольно уродливо, но иллюстрирует тот факт, что явное является более надежным и предсказуемым, чем неявное. И он может быть улучшен до версии, которая соответствует желаемым деталям даже более точно, чем когда-либо была разбита строка.

2 голосов
/ 03 августа 2010

Насколько согласован этот вывод? Всегда ли есть значение в каждом столбце? Если это так, попробуйте это:

line = line.replaceFirst("(?:\s+\d+[KM]?){3}", "");

При таком подходе вам не нужно беспокоиться о пустых строках, поскольку регулярное выражение не соответствует им.

2 голосов
/ 03 августа 2010

Используйте следующее регулярное выражение и проверяйте длину массива в каждой строке! А также рассмотрите возможность использования StringBuilder или StringBuffer вместо конкатенации.

 String[] s = inputLine.split("[\\s\\t]+");
0 голосов
/ 03 августа 2010

будьте осторожны при создании экземпляра str, насколько он велик, потому что это массив.Вам следует использовать список или что-то еще, потому что вы не знаете, сколько строк у вас на входе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...