PHP在Java中的'preg_match_all'功能

pxy2qtax  于 2023-03-16  发布在  Java
关注(0)|答案(4)|浏览(194)

在PHP中,如果我们需要匹配类似["one","two","three"]的内容,我们可以使用下面的正则表达式。

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

通过使用括号,我们还能够提取单词一、二和三。我知道Java中的Matcher对象,但无法获得类似的功能;我只能提取整个字符串。我将如何模仿Java中的preg_match行为呢?

mpgws1up

mpgws1up1#

使用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)是相同的整个匹配序列。
Example on ideone

资源:

  • Java文档-Matcher.group()
5kgi1eie

5kgi1eie2#

Java Pcre是一个提供所有php pcre函数的Java实现的项目。你可以从那里得到一些想法。检查项目https://github.com/raimonbosch/java.pcre

busg9geu

busg9geu3#

我知道这个帖子是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,请随时纠正,如果你认为这是一个坏的实现或东西。tks

m1m5dgzv

m1m5dgzv4#

两个版本,一个是List,另一个是Array:
私有静态列表getAllMatchesAsList(字符串str,字符串p){

List<List<String>> matches = Pattern.compile(p,  Pattern.DOTALL)
            .matcher(str)
            .results()
            .map(mr -> {
                List<String> list = new ArrayList<>();
                int bound = mr.groupCount();
                for (int i = 0; i <= bound; i++) {
                    String group = mr.group(i);
                    list.add(group);
                }
                return list;
            })
            .collect(Collectors.toList());
    return matches;
}

private static String[][] getAllMatchesAsArray(String str,String p) {

    String[][] matches = Pattern.compile(p, Pattern.DOTALL)
            .matcher(str)
            .results()
            .map(mr -> {
                int bound = mr.groupCount();
                String[] arr =new String[bound+1];
                for (int i = 0; i <= bound; i++) {
                    String group = mr.group(i);
                    arr[i]=group;
                }
                return arr;
            })
            .toArray(String[][]::new);
    return matches;
}

相关问题