3

C#の属性プロパティに基づいていくつかのオブジェクトを除外しようとしています。これは、次のように2つのコンマ区切りリストを比較することに基づいて行うことにしました。

  • 「a、b、c」〜「a、b、c」、「a、c、b」、「c、a、b」など。
  • "a、b、*"〜"a、b、c"、 "a、d、b"、 "g、a、b"、 "a、b"など。
  • "a、b、c"!〜 "a、c、d"、 "a、c"、"a"など。

単純な正規表現の一致式でこれを実行できるはずですが、まだ理解できません。

誰もがこれを行う方法を知っていますか?その間に、コードでブルートフォース攻撃を行います。

前もって感謝します

- 編集

〜私は同等を意味します、混乱してすみません。

また、「a、b、c」は「abra、barby、candybar」の場合もあります。その単一の文字ではなく、値のリスト。

4

3 に答える 3

4

これは正規表現ではありませんが、誰よりもはるかに単純です。

var attributes = input.Split(",");
var testCase = test.Split(",");

return attributes.All(x => testCase.Contains(x)) && testCase.All(x => attributes.Contains(x);

*が見つかった場合は、&&式の半分を省略してください。

于 2012-10-24T18:15:08.073 に答える
2

正規表現が必要な場合は、これについての私の見解を次に示します。

^                       # match start of string
 (?=.*a(?:,|$))         # assert it matches a followed by a comma or end-of-str
 (?=.*b(?:,|$))         # assert it matches b followed by a comma or end-of-str
 (?=.*c(?:,|$))         # assert it matches c followed by a comma or end-of-str
 (?:(?:a|b|c)(?:,|$))*  # match a, b or c followed by a comma or end-of-str
$                       # match end of string

を見つけた場合は.*、アサーションを保持しますが、正規表現の最後の部分を変更して、すべてに一致するようにします。2番目の例

^                       # match start of string
 (?=.*a(?:,|$))         # assert it matches a followed by a comma or end-of-str
 (?=.*b(?:,|$))         # assert it matches b followed by a comma or end-of-str
 (?:[^,]*(,|$))*        # match anything followed by a comma or end-of-str
$                       # match end of string

もちろん、正規表現を生成するために文字列を解析する必要があります。この時点で、私は率直に言って、従来のコード(おそらくそれも高速です)を使用することを好みます。例:(擬似コード):

setRequired  = Set(csvRequired.Split(','))
setActual    = Set(input.Split(','))

if (setActual.Equals(setRequired)))
{
    // passed
}

アスタリスクを見つけた場合は、アスタリスクを削除して、代わりにsetRequired使用してください.ContainsEquals

于 2012-10-24T18:10:03.690 に答える
-2

試す ((a|b|c)(,|))+

ここで、a、b、およびcはリスト内のすべてのオプションです。これが、 regexpalでの私のクイックテストへのパーマリンクです。最後のテスト「a、x、b」を見ると、正規表現は2つの別々の部分に一致していますが、Regex.Match()を使用してC#でも機能すると思います。

于 2012-10-24T17:49:32.890 に答える