1

たとえば、いくつかの形式のメッセージがあります。

"?I?Message message message\r\n"

ここで、名前付きグループを使用して正規表現でこのメッセージをキャプチャしたいと思います。

(?<Message>\?(?<Type>\S)\?(?<Text>[\S\s]+(\r\n)+))

しかし、このメッセージ形式に一致しないすべての文字列も必要です。例えば:

"Some data?I?Message message\r\nAnother part of data\n"

3つの一致が得られます:

  • 「いくつかのデータ」
  • ?I?メッセージ メッセージ\r\n
  • "データの別の部分\n"

メッセージ グループの Success フィールドが true に設定されているかどうかを確認して、前述の形式のメッセージが発生するかどうかを確認できます。そうしないと、「生データ」がいくつかあります。regex と Matches を使用してこのようなことを行うことは可能ですか?

4

3 に答える 3

0

からの結果オブジェクトRegex.MatchのタイプはMatchです。そのSuccessプロパティは、正規表現全体が一致したかどうかを示します。

ただしGroups、名前付きかどうかにかかわらず、個々のキャプチャ グループを確認するために使用できるプロパティもあります。名前付きキャプチャが一致しなかった場合、そのグループのSuccessプロパティは false になります。

だから

var m = Regex.Match("Fubar", "(?<x>Z)?.*");

それから

m.Success

は本当ですが、

m.Groups['Z'].Success

は偽です。

Regex.Matches正規表現は複数回一致する可能性があるため、各一致は返さMatchれるMatchCollection. ただし、正規表現はデフォルトで一致しない入力セクションをスキップするため、次のようになります。

Regex.Matches("ZaZ", "Z")

は 2 つの一致のコレクションを返しますが、" " については何も返しませんa\Gアンカーを使用して、前の試合の直後に次の試合を開始するように強制できます。

于 2012-07-21T20:27:26.277 に答える
0

これを行う1つの方法は次のとおりです。

var str = "Some data?I?Message message\r\nAnother part of data\n";
var unmatchedCharIndices = Enumerable.Range(0, str.Length);
foreach (Match match in Regex.Matches(str, @"(?<Message>\?(?<Type>\S)\?(?<Text>[\S\s]+(\r\n)+))"))
{
    unmatchedCharIndices = unmatchedCharIndices.Except(Enumerable.Range(match.Index, match.Length));
    //do other stuff with match
}
var unmatchedStrings = unmatchedCharIndices
            .Select((n, i) => new { n, i })
            .GroupBy(x => x.n - x.i) //this line will group consecutive nums in the seq
            .Select(x => str.Substring(x.First().n, x.Count()));
foreach (var unmatchedString in unmatchedStrings)
{
    //do something with non-match text
}

(コードは、最初に LINQ を使用して最後の x 連続アイテムunmatchedStringsを取得することに感謝します)

于 2012-07-21T20:19:44.907 に答える
0

To match mismatches

string toSearchString = "your string here";

Match match = new Regex("*some pattern here*").Match(toSearchString );

string unmatchedString = toSearchString.Replace(match.Value,"");

これで、一致しない文字列ができました。コーヒーが飲めます!!

于 2014-12-11T17:51:46.937 に答える