2 つの特定の文字の間の何かに一致する正規表現を作成するにはどうすればよいですか?
お気に入り:
ignore me [take:me] ignore me
?
包括的に一致させるにはどうすればよい[take:me]
ですか?
ダイナミックな言葉take:me
なので私も合わせたいです[123as d:.-,§""§%]
次の正規表現を使用できます。
"\\[(.*?)\\]"
このリンクは、それが機能する理由を理解するのに役立ちます。
Pattern pattern = Pattern.compile("\\[(.*?)\\]");
Matcher matcher = pattern.matcher("ignore me [take:me] ignore me");
if (matcher.find()) {
System.out.println(matcher.group(1));
}
これは印刷されますtake:me
。
一致させたい場合&([take:me])
は、これを使用する必要があります。
&\\(\\[(.*?)\\]\\)
正規表現で特別な意味を持つ文字をエスケープする必要はありません。(とのよう(
に)
)。
それらをエスケープするにはバックスラッシュを追加しますが、Java ではバックスラッシュは のように記述されるため、特別な意味を持つ char の前に\\
追加します。\\
そうすることで\\(
、Javaに次のように伝えています。 「特別な文字ではなく通常の文字として取り(
ます」。
java.util.regex.Matcherクラスは、正規表現が複数回出現するテキストを検索するために使用されます。Matcher を使用して、異なるテキストで同じ正規表現を検索することもできます。
Matcher クラスには、便利なメソッドがたくさんあります。完全なリストについては、Matcher クラスの公式 JavaDoc を参照してください。ここでは、コア メソッドについて説明します。対象となるメソッドのリストは次のとおりです。
マッチャーの作成
Matcher の作成は、Pattern クラスの matcher() メソッドを介して行われます。次に例を示します。
String text =
"This is the text to be searched " +
"for occurrences of the http:// pattern.";
String patternString = ".*http://.*";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(text);
マッチ()
Matcher クラスの matches() メソッドは、Matcher の作成時に Pattern.matcher() メソッドに渡されたテキスト全体に対して正規表現を照合します。次に例を示します。
boolean matches = matcher.matches();
正規表現がテキスト全体と一致する場合、matches() メソッドは true を返します。そうでない場合、matches() メソッドは false を返します。
matches() メソッドを使用して、テキスト内で複数回出現する正規表現を検索することはできません。そのためには、find()、start()、および end() メソッドを使用する必要があります。
見つめている()
lookingAt() メソッドは、matches() メソッドと同じように機能しますが、大きな違いが 1 つあります。lookingAt() メソッドは、テキストの先頭に対してのみ正規表現と一致しますが、matches() はテキスト全体に対して正規表現と一致します。つまり、正規表現がテキスト全体ではなくテキストの先頭に一致する場合、 lookingAt() は true を返しますが、matches() は false を返します。
次に例を示します。
String text =
"This is the text to be searched " +
"for occurrences of the http:// pattern.";
String patternString = "This is the";
Pattern pattern = Pattern.compile(patternString, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(text);
System.out.println("lookingAt = " + matcher.lookingAt());
System.out.println("matches = " + matcher.matches());
find() + start() + end()
find() メソッドは、Matcher が作成されたときに Pattern.matcher(text) メソッドに渡されたテキストで正規表現の出現を検索します。テキスト内に複数の一致が見つかった場合、find() メソッドは最初の一致を検出し、その後の find() の呼び出しごとに次の一致に移動します。
メソッド start() および end() は、見つかった一致が開始および終了するテキストへのインデックスを提供します。
次に例を示します。
String text =
"This is the text which is to be searched " +
"for occurrences of the word 'is'.";
String patternString = "is";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(text);
int count = 0;
while(matcher.find()) {
count++;
System.out.println("found: " + count + " : "
+ matcher.start() + " - " + matcher.end());
}
この例では、検索文字列でパターン「is」が 4 回検出されます。印刷される出力は次のようになります。
見つかった: 1 : 2 - 4
見つかった: 2 : 5 - 7
見つかった: 3 : 23 - 25
見つかった: 4 : 70 - 72
これらのチュートリアルも参照できます。
使用している文字が(?<=c)(.+)(?=c)
どこにあるかを試してくださいc
ルックアラウンド アサーションを使用することもできます。このようにして、括弧は一致自体に含まれません。
(?<=\\[).*?(?=\\])
(?<=\\[)
肯定的な後読みアサーションです。文字 "[" が一致の前にある場合は true
(?=\\])
肯定先読みアサーションです。文字 "[" が一致の後にある場合は true
.*?
は任意の文字に 0 回以上一致しますが、修飾子により可能な限り少なくなり?
ます。量指定子のマッチング動作を「貪欲」から「怠惰」に変更します。