PHP `preg_match_all` функциональность в Java - PullRequest
7 голосов
/ 01 октября 2010

В PHP, если нам нужно сопоставить что-то вроде ["one","two","three"], мы можем использовать следующее регулярное выражение с preg_match.

$pattern = "/\[\"(\w+)\",\"(\w+)\",\"(\w+)\"\]/"

Используя круглые скобки, мы также можем извлечь слова один, два и три. Мне известен объект Matcher в Java, но я не могу получить подобную функциональность; Я могу только извлечь всю строку. Как мне подражать поведению preg_match в Java.

Ответы [ 3 ]

13 голосов
/ 01 октября 2010

С Matcher, чтобы получить группы, вы должны использовать метод Matcher.group().

Например:

Pattern p = Pattern.compile("\\[\"(\\w+)\",\"(\\w+)\",\"(\\w+)\"\\]");
Matcher m = p.matcher("[\"one\",\"two\",\"three\"]");
boolean b = m.matches();
System.out.println(m.group(1)); //prints one

Помните, group(0) - это та же самая полная последовательность соответствия.

Пример на ideone


Ресурсы:

1 голос
/ 18 марта 2012

Java Pcre - проект, обеспечивающий реализацию всех функций php pcre на Java. Вы можете получить некоторые идеи оттуда. Проверьте проект https://github.com/raimonbosch/java.pcre

0 голосов
/ 08 сентября 2017

Я знаю, что это сообщение пришло из 2010 года, но я только что искал его, может, кому-то еще это тоже понадобится.Итак, вот функция, которую я создал для своих нужд.

В принципе, она заменит все ключевые слова значением из json (или модели, или любого источника данных)

как использовать:

JsonObject jsonROw = some_json_object;
String words = "this is an example. please replace these keywords [id], [name], [address] from database";
String newWords = preg_match_all_in_bracket(words, jsonRow);

Я использую эти коды в своем общем адаптере.

public static String preg_match_all_in_bracket(String logos, JSONObject row) {
    String startString="\\[", endString="\\]";
    return preg_match_all_in_bracket(logos, row, startString, endString);
}
public static String preg_match_all_in_bracket(String logos, JSONObject row, String startString, String endString) {
    String newLogos = logos, withBracket, noBracket, newValue="";
    try {
        Pattern p = Pattern.compile(startString + "(\\w*)" + endString);
        Matcher m = p.matcher(logos);
        while(m.find()) {
            if(m.groupCount() == 1) {
                noBracket = m.group(1);
                if(row.has(noBracket)) {
                    newValue = ifEmptyOrNullDefault(row.getString(noBracket), "");
                }
                if(isEmptyOrNull(newValue)) {
                    //no need to replace
                } else {
                    withBracket = startString + noBracket + endString;
                    newLogos = newLogos.replaceAll(withBracket, newValue);
                }
            }
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
    return newLogos;
}

Я также новичок в Java / Android, пожалуйста, не стесняйтесь исправлять, если вы считаете, что это плохая реализация или что-то в этом роде.,ТКС

...