【问题标题】:PHP's `preg_match_all` functionality in JavaJava 中的 PHP `preg_match_all` 功能
【发布时间】:2010-10-01 18:38:23
【问题描述】:

在 PHP 中,如果我们需要匹配 ["one","two","three"] 之类的东西,我们可以使用下面的正则表达式和 preg_match

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

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

【问题讨论】:

    标签: java php regex preg-match


    【解决方案1】:

    使用 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


    资源:

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        我知道这篇文章来自 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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-04-12
          • 1970-01-01
          • 2013-07-17
          • 2015-06-24
          • 2014-01-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多