2

次のようなプロパティを持つプロパティ ファイル (myfile.prop) があります。

name=sara
address=${this.address}
this.address=Bangalore
url=${abc}/${cde}
abc=lolkata
cde=florida
nested=${${this.work}.file}
this.work=engg
engg.file=mywork

解決された値を取得するたびに、これらのプロパティを解決する必要があります。

そのコードは次のとおりです。

static String resolve(String str, Properties props, boolean isResolved)
   {
      if (props == null || str == null)
      {
         return str;
      }

      String expandedString = str;
      String macroPattern   = "(\\$\\{)([a-z.\\-A-Z0-9_]*)(\\})";   
      Pattern pattern       = Pattern.compile(macroPattern);
      Matcher m             = null;
      boolean pendingItems  = true;

      do
      {
         m = pattern.matcher(expandedString);
         pendingItems = false;
         String formerStr = expandedString;

         while (m.find())
         {
            pendingItems   = true;
            String propVal = (String)props.get(m.group(2));
            if (propVal == null)
            {
               propVal = m.group(0);
            }
            expandedString = expandedString.replace(m.group(0), propVal);

            if (!fullyResolve)
            {
               return expandedString;
            }
         }
         m.reset();

         /* if the string did not change at all, it is a sign that this
          * string cannot be resolved, just return */
         if (expandedString.equals(formerStr))
         {
            return expandedString;
         }
      }
      while (pendingItems);

      return expandedString.trim();
   }

しかし、それがしているのは値を返すことだけです....何が問題なのか教えてもらえますか?

4

1 に答える 1

1

Apache Commons LangのStrSubstitutorを見てください。

ところで、正規表現を使用することは、この目的には最も効率的ではないと思います。

于 2012-10-18T07:06:39.687 に答える