4

私は最近、プロジェクトの正規表現を学ぼうとしましたが、これがあります:

patternstr = "<$Testing$>Go HERE <$Test2$>GO HERE 2 ";
Pattern pattern = Pattern.compile("<\\$\\w+\\$>\\w+");
Matcher matcher = pattern.matcher(patternstr);

どちらが返されますか

<$Testing$>Go
and
<$Test2$>GO

では、2 つの文字列を分離したまま残りのテキストを取得するにはどうすればよいでしょうか。そのように戻る必要があります

<$Testing$>Go HERE
<$Test2$>GO HERE 2

その後にテキストを含むタグをさらに追加すると、最初の 2 つだけでなく 3 つ目も返されます。

4

2 に答える 2

3

(正の)先読み、または負の文字クラスを追加する必要があります

何かのようなもの:

<\\$\\w+\\$>[^<]+

または(編集)

<\\$\\w+\\$>.+?(?=<)

コメントに基づいて編集されました (否定的な先読みではなく、肯定的なものにする必要があります)。

行末についての Alan のコメントは繰り返さない、彼らは正しい。

于 2013-04-21T23:03:54.617 に答える
0

中間で何を許可するかにもよりますが、Stringこれはかなり簡単です。

<$something$>something繰り返し一致する必要があります。<中間文字列がない場合は、次のことを行う必要があります

final String patternstr = "<$Testing$>Go HERE <$Test2$>GO HERE 2 ";
final Pattern pattern = Pattern.compile("<\\$([^$]++)\\$>([^<]++)");
final Matcher matcher = pattern.matcher(patternstr);
while (matcher.find()) {
    System.out.println(matcher.group(1));
    System.out.println(matcher.group(2));
}

出力:

Testing
Go HERE 
Test2
GO HERE 2 

説明:

  • <\\$オープニングにマッチ<$
  • ([^$]++)タグのコンテンツ、つまり次までのすべてを照合して取得します$
  • \\$>締めくくりにマッチ$>
  • ([^<]++)次まですべてを一致させて取得します<
于 2013-04-21T23:06:06.213 に答える