2012-08-08 28 views
15

をサブストリングずに文字列を検索:正規表現:私は大きなテキストを持っている

"Big piece of text. This sentence includes 'regexp' word. And this 
sentence doesn't include that word" 

私はによって「この」を起動し、「言葉」で終わるが、がない部分文字列を検索する必要があります単語「regexp」を含みます。

この場合、「this sentence doesn't include that word」という文字列は、受信したい文字列です。

正規表現でどうすればいいですか?

+0

あなたのルールは混乱しているか、期待される結果を誤っています。なぜ "と"なぜ "いいえ"大きなテキストのテキスト。 – sjakubowski

+0

@sjakubowski "部分文字列は 'this'で始まり、 'word'で終わります。" – Mathletics

+0

この規則は混乱しますが正しいものです。私はGoogleで何かを見つけるのに多くの時間を費やしましたが、何も見つかりませんでした。 – Artem

答えて

27

をケースを無視するオプションを指定すると、次のように動作するはずです:

\bthis\b(?:(?!\bregexp\b).)*?\bword\b 

例:http://www.rubular.com/r/g6tYcOy8IT

説明:

\bthis\b   # match the word 'this', \b is for word boundaries 
(?:    # start group, repeated zero or more times, as few as possible 
    (?!\bregexp\b) # fail if 'regexp' can be matched (negative lookahead) 
    .     # match any single character 
)*?    # end group 
\bword\b   # match 'word' 

\b各単語を囲むあなたは「くどい」の「アザミ」、または「単語」で「この」にマッチするように、部分文字列に一致していないことを確認します。

これは、開始単語と終了単語の間の各文字をチェックして、除外された単語がないことを確認することによって機能します。

+2

それは私が必要とするものです!ありがとうございました! – Artem

+2

+1正規表現とそれで遊ぶためのリンクの良い説明のために - 私はこれを類似のものに適用することができ、説明なしに苦労したでしょう。私はちょうどそれがどのように動作するのかを言わずにちょっとしたコードを与える答えにうんざりする。 –

+0

あなたは私をたくさん助けました!ありがとう! –

3

先読みアサーションを使用してください。

あなたは、文字列を別の部分文字列が含まれていないかどうかを確認したい場合は、あなたが書くことができます。

/^(?!.*substring)/ 

あなたがthiswordのためにも、先頭と行の終わりを確認する必要があります。

/^this(?!.*substring).*word$/ 

もう1つの問題は、検索文字列を使用していないこと、文章を探したいこと(自分の仕事の権利が分かっている場合)です。

だから解決策は次のようになります。使用方法の

perl -e ' 
    local $/; 
    $_=<>; 
    while($_ =~ /(.*?[.])/g) { 
    $s=$1; 
    print $s if $s =~ /^this(?!.*substring).*word[.]$/ 
    };' 

例:

$ cat 1.pl 
local $/; 
$_=<>; 
while($_ =~ /(.*?[.])/g) { 
    $s=$1; 
    print $s if $s =~ /^\s*this(?!.*regexp).*word[.]/i; 
}; 

$ cat 1.txt 
This sentence has the "regexp" word. This sentence doesn't have the word. This sentence does have the "regexp" word again. 

$ cat 1.txt | perl 1.pl 
This sentence doesn't have the word. 
+0

その先読みだけでは仕事はできません。ネストされた先読みを使用する必要があります。そして、それに続くコードスニペットは説明が難しいです(私はPerlを知らない)。 :/ – KRyan

+0

@DragoonWraith:どういうことですか?この魂はこの課題を解決します。あなたはそれを自分で試すことができます。 –

+0

私はRegExを掲載しようとしましたが、そうしていませんでした。 '(?!(?! ')を使用すると、' word'の後ろに部分文字列が現れても 'this'の後ろに部分文字列が現れることはありませんこれで解決しました。PerlをテストするためのPerlは用意されていませんが、私はそれを見て何も学んでいません。とにかくRegExソリューションではないことを私が指摘すると、手動でそのwhileループ。その質問は 'perl'ではなく' regex'というタグが付いています。 – KRyan

関連する問題