0

現在、vb.netを使用して.netWindowsアプリをコーディングしています。

Regex.Match記事から特定のテキストを抽出するために正規表現を渡そうとしています。正規表現内にif条件を記述するにはどうすればよいですか?この正規表現のチートシートを読みました。これによれば、を使用して条件を指定できます<?()>が、例は示されていません。

たとえば、次のテキストがあります。

"Mary have banana. Mary have apple. Mary have NO pear."

banana次の式を使用して、(1) 、(2)apple、および(3)を取り出すことができますNO pear

mary have (.+?\.)+?

maryしかし、(1)bananaと(2)の果物だけを抽出したい場合はapple、その部分に条件を追加する必要があると思い(.+?\.)+?ますよね?正規表現で条件を一覧表示するにはどうすればよいですか?

助けてください、ありがとう!

4

4 に答える 4

2

ここでこれを試してください:

Mary\shave\s(?!NO)(\S*)

ここでオンラインで試すことができます: regexr.com?2thid

最初の部分は否定的な先読みアサーションです。つまり、「Mary have NO」がある場合、この正規表現は一致しません。それ以外の場合は、"Mary have" の後の単語が最初のキャプチャ グループに入れられます。

ここでPerlretut(.netでも同じと仮定)で条件部分が説明されていますが、私の解決策はもっと簡単だと思います。

于 2011-04-13T08:38:01.110 に答える
1

他の人が特定のケースの解決策を提供しているので、見出しに記載されている「if 句」に焦点を当てます。

.NET は、次のパターンを使用して条件をサポートします。

(?(bob)[a-z]+|[0-9]+)

正規表現は、最初にテキスト表現 (括弧内の部分) との一致を試みます。一致する場合、全体的な表現は、パイプ ( [a-z]+) の前のサブ表現を使用して一致を試みます。それ以外の場合は、サブ表現を使用して一致を試みます。パイプ ( [0-9]+) の後の式。

そうは言っても、ステマが示唆する否定的な先読みは、あなたがやろうとしていることにより適していると思います.

注: 「テスト」部分では、ネガティブ ルック ビハインドなどのゼロ幅アサーションを使用することもできます。

(?(?<!\s)[a-z]+|[0-9]+)

もちろん、「テスト」式は常にゼロ幅と見なされるため、ゼロ幅の先読みは冗長です。

于 2011-04-13T09:20:40.230 に答える
0

これは、正規表現の手間をかけずに使用できるソリューションですが、C#でしか回答できません

    string sentence = "Mary have banana Mary have apple Mary have NO pear";
    if (sentence.Contains("banana"))
    {
        string x= sentence.Remove(sentence.IndexOf("banana"),"banana".Length);
    }

笑わないでください XD ただのスピードフィックスです。すすぎ、残りのアイテムについて繰り返すだけです

于 2011-04-13T08:31:29.000 に答える
0

次に、.Split()メソッドを使用してみてください。分割はおそらくこの文字列のようになります

sentence = "Mary have banana Mary have apple Mary have NO pear"; 
string[] brokenUp = sentence.Split(
      new String[] 
      { 
          "first fruit as string variable", 
          "second fruit as string variable", 
          "third fruit as string variable" 
      }, 
      StringSplitOptions.None
);
string newSentence = null;
for (int i = 0; i < brokenUp.Length; i++)
{
    newSentence += brokenUp[i];
}
于 2011-04-13T08:42:53.060 に答える