私の質問は次のとおりです。GWTで正規表現を使用する良い解決策はありますか?
たとえば、String.split(regex)の使用に満足していません。 GWTはコードをJSに変換し、正規表現をJS正規表現として使用します。しかし、Java MatcherまたはJava Pattern。のようなものは使用できません。しかし、グループのマッチングにはこれらが必要です。
可能性やライブラリはありますか?
Jakarta Regexpを試しましたが、GWTはJava SDKのこのライブラリが使用するSDKのすべてのメソッドをエミュレートしないため、他の問題がありました。
クライアント側で次のようなものを使用できるようにしたい:
// Compile and use regular expression
Pattern pattern = Pattern.compile(patternStr);
Matcher matcher = pattern.matcher(inputStr);
boolean matchFound = matcher.find();
if (matchFound) {
// Get all groups for this match
for (int i=0; i<=matcher.groupCount(); i++) {
String groupStr = matcher.group(i);
System.out.println(groupStr);
}
}
RegExpを使用した同じコードは次のようになります。
// Compile and use regular expression
RegExp regExp = RegExp.compile(patternStr);
MatchResult matcher = regExp.exec(inputStr);
boolean matchFound = matcher != null; // equivalent to regExp.test(inputStr);
if (matchFound) {
// Get all groups for this match
for (int i = 0; i < matcher.getGroupCount(); i++) {
String groupStr = matcher.getGroup(i);
System.out.println(groupStr);
}
}
GWT 2.1には、問題を解決する可能性のある RegExp
クラスがあります。
この回答は、ここでの他の回答のように、1つだけでなく、すべてのパターンマッチを対象としています。
関数:
private ArrayList<String> getMatches(String input, String pattern) {
ArrayList<String> matches = new ArrayList<String>();
RegExp regExp = RegExp.compile(pattern, "g");
for (MatchResult matcher = regExp.exec(input); matcher != null; matcher = regExp.exec(input)) {
matches.add(matcher.getGroup(0));
}
return matches;
}
...およびサンプル使用:
ArrayList<String> matches = getMatches(someInputStr, "\\$\\{[A-Za-z_0-9]+\\}");
for (int i = 0; i < matches.size(); i++) {
String match = matches.get(i);
}
純粋なGWTソリューションが必要な場合、それが実現できるかどうかはわかりません。ただし、JSNIを使用する場合は、JavaScriptのRegExpオブジェクトを使用して、一致したグループとすべてを取得できます。 GWTおよびJavaScript RegExpオブジェクトのJSNIを学ぶ必要があります。
GWTxライブラリ は、Java.util.regex.Patternおよび友人のエミュレーションを提供するようです。完全には見えませんが(特に、Matcher)、良いスタートになるかもしれません。
クライアント側のJavaクラスの独自の実装をプラグインするために使用する技術は<super-source>
モジュールXMLでの宣言。これは、GWTのドキュメントの「1つのパッケージ実装を別のパッケージ実装にオーバーライドする」のモジュールXML形式の説明で言及されています。 GWTの標準JRE翻訳可能クラスも同じ方法でエミュレートされます。