web-dev-qa-db-ja.com

正規表現を使用して部分文字列を抽出する方法

'という2つの一重引用符で囲まれた文字列があります。一重引用符の間に必要なデータがあります。

次のテキストから「欲しいデータ」を抽出するための正規表現を書くにはどうすればいいですか?

mydata = "some string with 'the data i want' inside";
320
asdasd

一重引用符で囲む必要があると仮定すると、この正規表現を 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));
}

結果:

欲しいデータ
487
Mark Byers

これには正規表現は必要ありません。

プロジェクトにApache commons langを追加し( http://commons.Apache.org/proper/commons-lang/ )、次に使用します。

String dataYouWant = StringUtils.substringBetween(mydata, "'");
60
Beothorn
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));
        }

    }
}
11
Sean McEligot

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)
9
Debilski

これには簡単なワンライナーがあります。

String target = myData.replaceAll("[^']*(?:'(.*?)')?.*", "$1");

一致するグループをオプションにすることで、その場合は空白を返すことで、見つからない引用符も検索できます。

live demo を参照してください。

7
Bohemian
String dataIWant = mydata.replaceFirst(".*'(.*?)'.*", "$1");
5
ZehnVon12

javaScriptのように:

mydata.match(/'([^']+)'/)[1]

実際の正規表現は/'([^']+)'/です。

もしあなたが欲張りでない修飾子を使うなら(他の記事のように)、それはこのようなものです:

mydata.match(/'(.*?)'/)[1]

それはきれいです。

3
Mihai Toader

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
2

String dataIWant = mydata.split("'")[1];

見る ライブデモ

2
ZehnVon12

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

0
kaushalop

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, "'", "'");
0
Memin