正規表現2つの文字列間のすべての文字に一致


435

例:「これは単純な文章です」です。

「This is」と「sentence」の間のすべての文字を一致させたい。改行は無視してください。正しい構文がわかりません。


11
Regexを使用している環境を示す必要がある場合があります。改行を「無視する」という意味によって、違いがある場合があります。
Andrew Barber

回答:


647

例えば

(?<=This is)(.*)(?=sentence)

Regexr

「これは」と「文章」がマッチに含まれないように後読み(?<=)と先読みを使用しました(?=)が、これはユースケース次第であり、単純に書くこともできますThis is(.*)sentence

ここで重要なことは、正規表現エンジンの「ドットオール」モードをアクティブにして、.が改行と一致するようにすることです。ただし、これを行う方法は、正規表現エンジンによって異なります。

次は、.*またはを使用する場合です.*?。最初のものは貪欲で、文字列の最後の「文」まで一致し、2番目のものは遅延して、文字列の次の「文」まで一致します。

更新

Regexr

This is(?s)(.*)sentence

(?s)はdotall修飾子をオンにし、.一致する改行文字を作成します。

アップデート2:

(?<=is \()(.*?)(?=\s*\))

あなたの例「これは(簡単な)文です」と一致しています。Regexrについてはこちらをご覧ください


@tchrist、申し訳ありませんが、これを調べなければなりませんでした。これは正しいと理解してThis is(?s)(.*)sentenceいますか?
stea

@stema:はい、それはほとんどの正規表現ライブラリで「すべてドット」モードを有効にするために機能するはずです。
tchrist

1
これでほとんど私の問題は解決しましたが、パターンに空白文字を含めるにはどうすればよいですか?「(。*?)())」をシーケンスの最後の「」に一致するように試しましたが、機能しませんでした。
0xbadf00d

28
ちょうど1ノート- regexrは後読みがJavaScriptでサポートされていないことを今言う
KOVO

2
テキストのブロックでこの分割の繰り返されるインスタンスを処理する方法はありますか?FOrインスタンス:「これは単なる単純な文章です。ここにいくつかの追加のものがあります。これは単純な文章です。これにさらにいくつかあります。これは単純な文章です。」現在、各インスタンスではなく文字列全体に一致します。
jzadra 2018

181

レイジー数量詞が必要

受け入れられた回答の正規表現が私にはまったく正しくないように見えるため、この質問を復活させます。どうして?なぜなら

(?<=This is)(.*)(?=sentence)

で一致my first sentence. This is my secondしますThis is my first sentence. This is my second sentence.

デモを参照してください

2つのルックアラウンドの間には、遅延量指定子が必要です。a ?を追加すると、スターが遅延します。

これはあなたが望むものと一致します:

(?<=This is).*?(?=sentence)

デモを参照してください。不要になったキャプチャグループを削除しました。

改行間で一致するDOTALLモード

デモでは、「ドット一致改行モード」(別名)ドットオールが設定されていることに注意してください(さまざまな言語でDOTALLをオンにする方法を参照してください)。多くの正規表現フレーバーでは(?s)、式を次のように変更して、オンライン修飾子で設定できます。

(?s)(?<=This is).*?(?=sentence)

参照


あなたは捕獲グループについて正しいです。なぜこれをしたのかわからない。しかし、違い.*とは.*?また私の答え(「更新」前の段落)に説明されています。だから私は私の答えが間違っているとは思わない。
Stea

2
@stema昨日あなたの答えのいくつかを調べている間、私はつまらないことについて申し訳ありませんが、それは私をけいれんさせた唯一のものです。:)私は最初の行をis incorrectからdoesn't seem quite correct to me... に和らげました。それがあなたをけいれんさせないこと願っています。おそらく、このような高トラフィックの回答の正規表現がどうあるべきかについての認識の違いだけです。
zx81 2014年

39

試してThis is[\s\S]*sentence、JavaScriptで動作する


この方法で遅延ルックアップを実行するにはどうすればよいですか?
AGamePlayer 2015年

4
上記と同じ@AwQiruiGuo。[\s\S]*?(別名:貪欲でないワイルドカード)
phil294


13

これを使って: (?<=beginningstringname)(.*\n?)(?=endstringname)


なぜ賛成票がすべて投票されるのかわからない。これによりendstringname
0〜1の

ログ行の先頭(タイムスタンプなど)を削除すると便利です。開始文字列には改行を使用し、終了文字列には「at」を使用しました。
Stan

2

誰かがJenkinsコンテキスト内でこの例を探している場合。build.logを解析し、一致が見つかった場合、その一致でビルドに失敗します。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

node{    
    stage("parse"){
        def file = readFile 'build.log'

        def regex = ~"(?s)(firstStringToUse(.*)secondStringToUse)"
        Matcher match = regex.matcher(file)
        match.find() {
            capturedText = match.group(1)
            error(capturedText)
        }
    }
}


1

これは私のために働きました(私はVS Codeを使用しています):

ために: This is just\na simple sentence

使用する: This .+ sentence


0

崇高なテキスト3x

崇高なテキストで、あなたが保持したい2つの単語を書いてください。

「これは」と「文」

そして、あなたはその間に。*を書きます

すなわち This is .* sentence

これでうまくいくはずです


質問がSublime Textでこれを行う方法については不明ですが、ほとんどがSublime Textで機能します。「This is」と「sentence」の間に改行がある場合は機能しません。また、崇高なテキストはこれら2つの文字列ののテキストだけでなく、「これは」と「文」を選択します。
ディランキネット

0

ここに私がそれをした方法があります:
これは私にとって必要な特定の正規表現を理解しようとするよりも簡単でした。

int indexPictureData = result.IndexOf("-PictureData:");
int indexIdentity = result.IndexOf("-Identity:");
string returnValue = result.Remove(indexPictureData + 13);
returnValue = returnValue + " [bytecoderemoved] " + result.Remove(0, indexIdentity); ` 

0

VIMでクイック検索を行うには、Vimコントロールプロンプトで次のように使用できます:/ This is。* \ _。* sentence


0

私はここでregexを検索して、この印刷構文を、Python3の古いスクリプトで、Python 2の印刷「文字列」間で変換しました。うまく機能します。それ以外の場合は、追加の変換に2to3.pyを使用します。これが他の人のための私の解決策です:

Regexr.comで試してください(何らかの理由でNP ++では機能しません)。

find:     (?<=print)( ')(.*)(')
replace: ('$2')

変数の場合:

(?<=print)( )(.*)(\n)
('$2')\n

ラベルと変数の場合:

(?<=print)( ')(.*)(',)(.*)(\n)
('$2',$4)\n

Python2のすべての印刷 "string"をPython3のprint( "string")に置き換える方法は?


0

RegExは、Javaアプローチを使用して2つの文字列間のすべてを照合します。

List<String> results = new ArrayList<>(); //For storing results
String example = "Code will save the world";

RegEx (。?)*を使用するために、PatternオブジェクトとMatcherオブジェクトを使用してみましょう。

Pattern p = Pattern.compile("Code "(.*?)" world");   //java.util.regex.Pattern;
Matcher m = p.matcher(example);                      //java.util.regex.Matcher;

Matcherには複数の一致が含まれる可能性があるため、結果をループして保存する必要があります。

while(m.find()){   //Loop through all matches
   results.add(m.group()); //Get value and store in collection.
}

この例には「will save the」という単語のみが含まれますが、より大きなテキストでは、より多くの一致が見つかる可能性があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.