この記事では、より効率的な正規一致、つまり時間のかかる正規表現のコンパイルを改善することのみを追求します。これは、正規一致のシナリオが多数ある状況に適しています。
効率化の本質:ローカルキャッシュ + コンパイル回数の削減(効率的なJavaを考える、データベース接続にかかるTCPの時間を考える、条件が許せばシステム内でよく使われる正規表現を収集でき、システムの初期化時にメモリにロードすることも可能) + (オプション:データを収集し、ジョブまたはスレッドを通じて事前に通常のツールにロードする)
maven:version 部分は単独で maven リファレンスからダウンロードされます。
<dependency> <groupId>com.github.ben-manes.caffeine</groupId> <artifactId>カフェイン</artifactId> </dependency>
com.github.benmanes.caffeine.cache.Cache をインポートします。
com.github.benmanes.caffeine.cache.Caffeine をインポートします。
org.apache.commons.lang3.StringUtils をインポートします。
org.springframework.util.StopWatch をインポートします。java.util.ArrayListをインポートします。
java.util.Listをインポートします。
java.util.Objectsをインポートします。
java.util.regex.Patternをインポートします。/**
* 説明: 正規表現ツール クラス
*/
public class RegUtils { private RegUtils() { }
public static Final Cache<String, Pattern> REG_PATTERNS = Caffeine.newBuilder().maximumSize(512).build();
/**
* 获取パターン
* @param 式
* @return
*/
public static Pattern getRegPattern(Stringexpression) { if (StringUtils.isEmpty(expression)) { throw new IllegalArgumentException("式が空です"); パターン ifPresent = REG_PATTERNS.getIfPresent(expression); if (Objects.nonNull(ifPresent)) { return ifPresent; パターン コンパイル = null; try { コンパイル = Pattern.compile(式); } catch (例外 e) {
throw new IllegalArgumentException("式エラー:" + 式 + " " + e.getMessage()); if (Objects.nonNull(compile)) { REG_PATTERNS.put(式, コンパイル)
; コンパイルを返します 。 }
/**
* 通常の置換は String クラスの replaceAll メソッドを置換します
* @param value
* @param reg
* @param 置換
* @return
*/
public static String replaceReg(String value, String reg, String replace) { return getRegPattern(reg).matcher(value).replaceAll(replacement); }public static void main(String[] args) {
文字列式 = "[0-9]{3}[-]{1}[0-9]{4}";
文字列データ = "333-8889";
StopWatch stopWatch = 新しい StopWatch(式);
stopWatch.start();
ブール値の一致 = getRegPattern(式).matcher(データ).matches();
stopWatch.stop();
System.out.println(stopWatch.prettyPrint());
List<String> 文字列 = new ArrayList<>();
strings.add("333-8889");// true
for (String string : strings) { StopWatch stopWatch1 = new StopWatch(expression); stopWatch1.start(); ブール値のmatches1 = getRegPattern(expression).matcher(string).matches(); stopWatch1.stop(); System.out.println(matches1);
System.out.println(stopWatch1.prettyPrint());
} }
}
結果を比較する
最初のコンパイル後にキャッシュに保存し、2 回目にはキャッシュから直接取得します。これにより、効率と速度が質的に変わります。