0

これは、 Java正規表現に一致するすべての重複するサブストリングのフォローアップです。

このコードを高速化する方法はありますか?

public static void allMatches(String text, String regex)
  {
    for (int i = 0; i < text.length(); ++i) {
      for (int j = i + 1; j <= text.length(); ++j) {
        String positionSpecificPattern = "((?<=^.{"+i+"})("+regex+")(?=.{"+(text.length() - j)+"}$))";
        Matcher m = Pattern.compile(positionSpecificPattern).matcher(text);

        if (m.find()) 
        {   
          System.out.println("Match found: \"" + (m.group()) + "\" at position [" + i + ", " + j + ")");
        }   
      }   
    }   
  }
4

1 に答える 1

2

他の質問では、マッチャーのregion()方法について言及しましたが、それを十分に活用していませんでした。それを非常に価値のあるものにしているのは、アンカーがスタンドアロンの文字列の境界であるかのように、領域の境界で一致することです。これは、useAnchoringBounds()オプションが設定されていることを前提としていますが、これがデフォルト設定です。

public static void allMatches(String text, String regex)
{
  Matcher m = Pattern.compile(regex).matcher(text);
  int end = text.length();
  for (int i = 0; i < end; ++i)
  {
    for (int j = i + 1; j <= end; ++j) 
    {
      m.region(i, j);

      if (m.find()) 
      {   
        System.out.printf("Match found: \"%s\" at position [%d, %d)%n",
                          m.group(), i, j);
      }   
    }   
  }   
}

サンプルの文字列と正規表現を考えると:

allMatches("String t = 04/31 412-555-1235;", "^\\d\\d+$");

...私はこの出力を取得します:

Match found: "04" at position [11, 13)
Match found: "31" at position [14, 16)
Match found: "41" at position [17, 19)
Match found: "412" at position [17, 20)
Match found: "12" at position [18, 20)
Match found: "55" at position [21, 23)
Match found: "555" at position [21, 24)
Match found: "55" at position [22, 24)
Match found: "12" at position [25, 27)
Match found: "123" at position [25, 28)
Match found: "1235" at position [25, 29)
Match found: "23" at position [26, 28)
Match found: "235" at position [26, 29)
Match found: "35" at position [27, 29)
于 2012-07-07T05:54:34.940 に答える