2017-11-04 14 views
1

正規表現を使用してキーワード間の特定の単語を一致させたいファイルがあります。たとえば、キーワード "start"の後にキーワード "end"の後に "dog"という単語が出現するたびに一致させたいとします。正規表現で2つの単語の間にある単語を検索する

dog horse animal cat dog // <-- don't match 
random text dog // <-- don't match 
start 

brown dog 
black dog 
cat horse animals 

end 
dog cat // <-- don't match 
good dog // <-- don't match 

はたぶん正規表現は、私は、その後、パイプ、それを新しい正規表現に単語「開始」と単語の前に「終了」の後のテキストを取得することができ、パイプの機能を持っていますか?それで、2番目の正規表現で "dog"を検索することができます。私は正規表現に慣れていないし、解決策を思いつくために苦労している。ありがとう

+0

基本的に見た目の裏は固定長である必要があるため、できません。 – Bohemian

答えて

3

をデバッグするためにこれを使用することができ、「グローバル」(すなわち非連続的であるいくつかの試合を収集)と一致するすべてのコンテナ内に存在している必要があり、そのような」とあなたは規定を提供「(開始 『と『終了』この場合、間』)、これは一般的なだけ最初に試みた位置に一致してPCREの 『\ G』、などの構造を求めて:

(?:\G(?!\A)|start)(?:(?!end).)*?\Kdog 

は、アクションでそれを参照してください。 at:https://regex101.com/r/uV7EjE/1

これは普遍的にサポートされていない構文とPCRE( '\ K')に固有の構文を使用することに注意することが重要です。各部分の説明:

/(?: 
\G(?!\A)  # Match only at the first position, since the usual behaviour of regex is to attempt to match at each position. In effect, this ensures we only match immediately after the last valid "dog". 
|start   # Or match "start". 
) 
(?:(?!end).)*? # Match as few characters as possible, making sure we don't encounter "end". 
\K    # Reset the consumption counter so everything before this isn't matched. 
dog    # Match what we want. 
/gmsx 

あなたはより基本的な正規表現エンジンのためのより広いサポートで何かを必要とする代わりに、場合、あなたが実際にそのをチェックし、完全なグループと一致するインスタンスstart.*?endため、パイプにシンプルな表現が必要なのか「犬」のすべての出現のための内容。

+0

これは非常に巧妙で興味深い解決方法です。詳細な説明をありがとう!! – Michael

+0

ハハおかげさまで、幸せに助けて!これは基本的に「x」と「y」の間の標準的な「一致」ですが、入力に関する特定の事柄を知っていればさらに賢明になります。たとえば、「終了」が外れていないことがわかっていて、「開始」なしに存在しない場合は、単に「終了」があるかどうかを調べることができます。例: 'dog(?=( ?:(?! start)。)*?end) 'これはより簡単でより普遍的なサポートです:) – jaytea

+0

これはhtmlタグ間でも特定の値を見つけるのに非常に便利なようです。 – Michael

-1

私はあなたが正規表現を求めていることを知っていますが、あなたが特定の言語を使用している場合、より適切な解決法があるかもしれません。例えば、PHPでこの機能が動作します:

function getStringBetween($string, $start, $end){ 
    $string = " ".$string; 
    $ini = strpos($string,$start); 
    if ($ini == 0) return ""; 
    $ini += strlen($start); 
    $len = strpos($string,$end,$ini) - $ini; 
    return substr($string,$ini,$len); 
} 
+0

私の主張は:特定の言語で解決策を尋ねることができれば、人々はよりよく助けることができるかもしれません。 – Bing

+0

コメントは誰でも、コメントを削除して下降して...説明が役に立ちます。 – Bing

0

更新:(。?)

スタート(。?)(犬)+をここに、下記のリンク上の

テストを終了画面は次のとおりです。

enter image description here

前回: (、正確にあなたに答えていない可能性があり、この点に注意してくださいあなたが働いている言語に大きく依存しているため)。

Ref。 1 link Ref。 2 link

他のコメントが言っているように、開発している言語によっても異なります。どこに開発しているかを教えてもらえれば、私はあなたに良い答えを与えるかもしれません。あなたが一致しているとき

また、あなたはhttps://regex101.com/

+0

regex101の正規表現を使ってハイライトする言葉を得ることができませんでした。私はこれをbashスクリプトで動作させるために必要とします。標準的な正規表現があればうまくいくと思います。私の割り当てには、他のbashコマンドやツールを使わずに正規表現が必要です。 – Michael

+0

私はこれを見つけようとします。フィードバックありがとう – oetoni

+0

素晴らしい感謝。私はその間にあなたがリンクしている記事をチェックします – Michael

関連する問題