'
という2つの一重引用符で囲まれた文字列があります。一重引用符の間に必要なデータがあります。
次のテキストから「欲しいデータ」を抽出するための正規表現を書くにはどうすればいいですか?
mydata = "some string with 'the data i want' inside";
一重引用符で囲む必要があると仮定すると、この正規表現を 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));
}
結果:
欲しいデータ
これには正規表現は必要ありません。
プロジェクトに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)
これには簡単なワンライナーがあります。
String target = myData.replaceAll("[^']*(?:'(.*?)')?.*", "$1");
一致するグループをオプションにすることで、その場合は空白を返すことで、見つからない引用符も検索できます。
live demo を参照してください。
String dataIWant = mydata.replaceFirst(".*'(.*?)'.*", "$1");
javaScriptのように:
mydata.match(/'([^']+)'/)[1]
実際の正規表現は/'([^']+)'/
です。
もしあなたが欲張りでない修飾子を使うなら(他の記事のように)、それはこのようなものです:
mydata.match(/'(.*?)'/)[1]
それはきれいです。
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
String dataIWant = mydata.split("'")[1];
見る ライブデモ
Mihai Toaderが魅力のように機能するという上記の答えに同意します。更新に基づいてそれにわずかな変更。
let string = "fact-tab-1 extra stuff you dont care about"
let matchResult = string.match(/fact-tab-./);
console.log(matchResult)
console.log('The extracted part would be : ' + matchResult[0])
document.getElementById('result').innerHTML = 'The extracted part would be : ' + matchResult[0];
<div id="result">
</div>
実行例: JSFiddle
Apache Commons Langは、Java.lang APIのヘルパーユーティリティのホスト、特に文字列操作メソッドを提供します。あなたの場合、開始部分文字列と終了部分文字列は同じなので、次の関数を呼び出してください。
StringUtils.substringBetween(String str, String tag)
同じ文字列の2つのインスタンス間にネストされている文字列を取得します。
開始部分文字列と終了部分文字列が異なる場合、次のオーバーロードメソッドを使用します。
StringUtils.substringBetween(String str, String open, String close)
2つの文字列の間にネストされている文字列を取得します。
一致する部分文字列のすべてのインスタンスが必要な場合は、
StringUtils.substringsBetween(String str, String open, String close)
開始タグと終了タグで区切られた部分文字列を文字列で検索します配列内の一致するすべての部分文字列を返します。
問題の例では、一致する部分文字列のすべてのインスタンスを取得します
String[] results = StringUtils.substringsBetween(mydata, "'", "'");