回答:
一重引用符の間の部分が必要であると仮定して、この正規表現をMatcher
:で使用します
"'(.*?)'"
例:
String mydata = "some string with 'the data i want' inside";
Pattern pattern = Pattern.compile("'(.*?)'");
Matcher matcher = pattern.matcher(mydata);
if (matcher.find())
{
System.out.println(matcher.group(1));
}
結果:
私が欲しいデータ
this 'is' my 'data' with quotes
返すのではis
なく、早期に停止して戻りis' my 'data
ます。これはデフォルトの動作です。
これには正規表現は必要ありません。
Apache Commons langをプロジェクト(http://commons.apache.org/proper/commons-lang/)に追加してから、次を使用します。
String dataYouWant = StringUtils.substringBetween(mydata, "'");
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
public static void main(String[] args) {
Pattern pattern = Pattern.compile(".*'([^']*)'.*");
String mydata = "some string with 'the data i want' inside";
Matcher matcher = pattern.matcher(mydata);
if(matcher.matches()) {
System.out.println(matcher.group(1));
}
}
}
複数の引用符で囲まれた文字列を簡単に処理する正規表現なしのソリューションであるScalaもチェックしたためです。
val text = "some string with 'the data i want' inside 'and even more data'"
text.split("'").zipWithIndex.filter(_._2 % 2 != 0).map(_._1)
res: Array[java.lang.String] = Array(the data i want, and even more data)
.split('\'').get(2)
Javaでその程度まで、または何かしませんか?それが読みやすい解決策だと思うなら、あなたは脳スキャンをする必要があるかもしれないと思います-誰かが私にコードゴルフをしようとしたようです。
Scalaでは、
val ticks = "'([^']*)'".r
ticks findFirstIn mydata match {
case Some(ticks(inside)) => println(inside)
case _ => println("nothing")
}
for (ticks(inside) <- ticks findAllIn mydata) println(inside) // multiple matches
val Some(ticks(inside)) = ticks findFirstIn mydata // may throw exception
val ticks = ".*'([^']*)'.*".r
val ticks(inside) = mydata // safe, shorter, only gets the first set of ticks
Apache Commons Langは、java.lang APIのヘルパーユーティリティのホストを提供します。特に、文字列操作メソッドです。あなたの場合、開始部分文字列と終了部分文字列は同じなので、次の関数を呼び出すだけです。
StringUtils.substringBetween(String str, String tag)
同じStringの2つのインスタンスの間にネストされているStringを取得します。
開始部分文字列と終了部分文字列が異なる場合は、次のオーバーロードメソッドを使用します。
StringUtils.substringBetween(String str, String open, String close)
2つの文字列の間にネストされている文字列を取得します。
一致する部分文字列のすべてのインスタンスが必要な場合は、次を使用します。
StringUtils.substringsBetween(String str, String open, String close)
開始タグと終了タグで区切られた部分文字列の文字列を検索し、一致するすべての部分文字列を配列で 返します。
問題の例では、一致する部分文字列のすべてのインスタンスを取得します
String[] results = StringUtils.substringsBetween(mydata, "'", "'");
あなたが使用する場合、これを使用してwhileループを配列内のすべての一致する部分文字列を格納できます
if (matcher.find())
{
System.out.println(matcher.group(1));
}
あなたは一致部分文字列を取得するので、これを使用してすべての一致部分文字列を取得できます
Matcher m = Pattern.compile("[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+").matcher(text);
// Matcher mat = pattern.matcher(text);
ArrayList<String>matchesEmail = new ArrayList<>();
while (m.find()){
String s = m.group();
if(!matchesEmail.contains(s))
matchesEmail.add(s);
}
Log.d(TAG, "emails: "+matchesEmail);