Получение определенных значений с помощью регулярных выражений - PullRequest
0 голосов
/ 26 мая 2010

Мне нужно сознательно изолировать каждую строку визитной карточки и получить ее значение.

Например, я хочу получить "5555" от X-CUSTOMFIELD.

Пока мои мысли таковы:

"X-CUSTOMFIELD;\\d+"

Я просматривал некоторые учебные пособия, и меня немного смущает, какую функцию использовать? Что бы вернуло мое регулярное выражение выше? Это даст мне всю строку или только числовую часть (5555)?

Я думал, что получу всю строку, я могу использовать подстроку, чтобы получить цифры?

BEGIN:VCARD
VERSION:2.1
N:Last;First;
FN:First Last
TEL;HOME;VOICE:111111
TEL;MOBILE;VOICE:222222
X-CUSTOMFIELD;5555
END:VCARD

Ответы [ 5 ]

0 голосов
/ 26 мая 2010
Pattern p = Pattern.compile("X-CUSTOMFIELD;(\\d+)");
Matcher m = p.matcher(your_string);
if(m.find()){
    MatchResult mr=m.toMatchResult();
    String value=mr.group(1);//this will be 5555
}
0 голосов
/ 26 мая 2010
            String customfield;
            Pattern p = Pattern.compile("X-CUSTOMFIELD;(.+)$");
            Matcher m = p.matcher(insertyourcomparestringhere);

            if (m.find()) customfield = m.group();

Это должно сработать. Только 5555 находится в пользовательском поле строки.

0 голосов
/ 26 мая 2010

Почему бы не попробовать следующее регулярное выражение:

^([^:]+):(.*)$

То, что вам нужно сделать, это прочитать данные vCard построчно, тогда у вас будет две группы совпадений (при условии, что выражение верно)

Группа 1 будет именем поля (X-CUSTOMFIELD), а Группа 2 будет данными этого поля (5555)

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

0 голосов
/ 26 мая 2010

Формат для полей vcard: KEY[;Attribute]:VALUE[;ATTRIBUTE]. Это похоже на опечатку в X-CUSTOMFIELD и должно читаться как X-CUSTOMFIELD:5555

Затем вы можете использовать line.split(":") в каждой строке, чтобы получить ключи и значения.

EDIT

Сначала я прочитал бы все строки из файла / сообщения и сохранил их в виде ключа / значения в Hashtable (HashMap недоступен на Android ...). Используйте функцию разделения, о которой я упоминал выше, чтобы разделить строку на ключ и часть значения.

После того, как это будет сделано, просто спросите хеш-таблицу о значении ключа "X-CUSTOMFIELD", и оно должно вернуть "5555". (Предполагая, что вы исправили формат vcard, я все еще уверен, что строка X-CUSTOMFIELD недействительна!)

РЕДАКТИРОВАТЬ 2

Если vcard допускает дублирование ключей, вы все равно можете использовать хеш-таблицу в качестве внутренней модели vcard, но значение должно быть типа List<String>, а не String, и значения vcard добавляются в этот список, например: 1022 *

 Hashtable<String, List<String>> vcard = new Hashtable<String, List<String>>();
 for (String line:lines) { // assuming lines is an array or collection with all rows
   String keyValuePair = line.split(":");
   List<String> values = vcard.get(keyValuePair[0]);
   if (values == null) {
     // first value for this key - need to create the list
     values = new ArrayList<String>();
     vcard.put(keyValuePair[0], values);
   }
   values.add(keyValuePair[1]);
 }

(непроверенный - если он не компилируется, обрабатывайте его как псевдокод ;-))

0 голосов
/ 26 мая 2010

вы можете искать ";" или ":" и используйте метод subString () из java API ... в качестве параметров, которые вы можете добавить, откуда и куда должна быть вырезана подстрока.

als end-param, вы можете использовать row.length-1, если "row" - ваша текущая строка

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