5

私は Android コーディングは初めてですが、Perl 正規表現の経験があります。0 個以上の識別子のリストを次のような正規表現と一致させる必要があります。

^\s*((\w\d\d\d)(\s+$2)*)?$

$2 は、以前に一致したグループ (\w\d\d\d) を参照することに注意してください。Android コードの場合、次のようになります。

Pattern.compile("^\\s*((\\w\\d\\d\\d)(\\s+\$2)*)?$")

Eclipse コンパイラーは \$2 をコンパイルしません。私は \2 も試しました。これはコンパイルされますが、リテラル番号 2 と一致しようとします。

ブルート フォース ソリューションは、識別子パターンを繰り返すことです。

Pattern.compile("^\\s*((\\w\\d\\d\\d)(\\s+(\\w\\d\\d\\d))*)?$")

これは機能しますが、以下の欠点があります: * いずれかの繰り返しで構文エラーを起こしやすい * 識別子が複雑になるにつれて文字列が大きくなる * 洗練されていない * 参照する必要がある場合はさらに複雑になる1つ以上の以前の試合

Javaで正規表現内の以前に一致したグループを参照する方法はありますか?

4

2 に答える 2

0

$エスケープする必要があるだけでなく、それ自体をエスケープする必要があることを忘れないでください\

だからあなたは必要です:

Pattern.compile("^\\s*((\\w\\d\\d\\d)(\\s+\\$2)*)?$")
于 2012-04-14T16:07:05.020 に答える
0

I am sorry about the confusion, my confusion. The regex:

Pattern.compile("^\\s*((\\w\\d\\d\\d)(\\s+\\$2)*)?$")

will match something like "A12 A12", therefore matching the previous match. (I just tried it on Eclipse and followed it with the debugger)

What I wanted is a way to write a short regex for a string like "A12 B35 C36 A011" In perl you can use variables a part of the pattern, therefore it can be done in perl:

$a='\w\d\d\d';
$mystring =~ /^\s*(($a(\s+$a)*)?$/;

Short and simple. Therefore I assumed in java it can also be done by concatenating strings (I just tried it and it works)

String id="\\w\\d\\d\\d";
Pattern.compile("^\\s*(" + id + "(\\s+" + id + ")*)?$");

It is not elegant, but it does the job.

于 2012-04-15T10:56:45.690 に答える