動的に変化するテキストがあり、その中のいくつかの部分を見つける方法が必要です。特にこれらのように:
+124今
+78今
+45今
したがって、私の値は常に「+」プラス記号で始まり、いくつかの数字、最小1つ、そして「今」の単語です。
私はこのような多くの方法を試しました:
if(myString.contains("+[0-9]+now")) //false
でもうんざりしました...手伝ってくれませんか?
String#matches()
代わりに使用してください:
if (myString.matches(".*\\+[0-9]+now.*"))
また、+
これは特別な正規表現文字であるため、エスケープする必要があります。
数字をキャプチャする必要がある場合は、とを使用Pattern
してMatcher
ください:
Pattern p = Pattern.compile("\\+([0-9]+)now");
Matcher m = p.matcher(myString);
while (m.find()) {
System.out.println(m.group(1));
}
()
はキャプチャグループです。つまり、一致したコンテンツを保存するように正規表現エンジンに指示するため、後で.を使用してコンテンツを取得できますgroup()
。
これを試して......
Pattern pat = Pattern.compile("\\+\\d+now");
Matcher mat = pat.matcher("Input_Text");
while(mat.find()){
// Do whatever you want to do with the data now...
}
次のように最初の「+」をエスケープする必要があります。
if(myString.matches("\\+[0-9]+now"));
+は、「この文字を1回以上検索する」ではなく、「文字列内で+を文字通り検索する」ことを意味します。
文字列と一致させるか、中央の数字を抽出するかを想定していますか?あなたの場合、問題は+
私たちが特殊文字であるということです、それであなたはそれを次のようにエスケープする必要があります:\\+
、それであなたの正規表現はになり\\+[0-9]+now
ます。
2番目の問題については、.contains
メソッドが正規表現ではなく文字列を受け取るため、コードが機能しません。
String str = "+124now";
Pattern p = Pattern.compile("\\+(\\d+)now");
Matcher m = p.matcher(str);
while (m.find())
{
System.out.println(m.group(1));
}
この場合、これがあなたが求めているものである場合に備えて、私は数字を抽出しました。
このメソッドcontains
は、引数を正規表現として解釈しません。matches
代わりにこの方法を使用してください。+
次のように、同様にエスケープする必要があります。
if (myString.matches("\\+\\d+now"))
+
文字列は常にで始まり、常に終わると言ったのでnow
、これが正しいことを確認してください。そうでない場合は、何かが間違っています。
String[] vals = {"+124now", "+78now", "-124now", "+124new"};
for (String s : vals) {
if (s.matches("^\\+(\\d+)now$")) {
System.out.println(s + " matches.");
} else {
System.out.println(s + " does not match.");
}
}
もちろん、番号を取得したい場合は、npintiが提案するようなマッチャーを使用してください。
編集:番号を取得する方法は次のとおりです。
Pattern p = Pattern.compile("^\\+(\\d+)now$");
for (String s : vals) {
Matcher m = p.matcher(s);
if (m.matches()) {
System.out.println(s + " matches and the number is: " + m.group(1));
} else {
System.out.println(s + " does not match.");
}
}