質問

.NET正規表現を使用して、次のような文字列を解析しようとしています:

H3Y5NC8E-TGA5B6SB-2NVAQ4E0

Splitを使用して次を返します。     H3Y5NC8E     TGA5B6SB     2NVAQ4E0

特定の文字セットに対して各文字を検証します(「I」、「O」、「U」、「W」の文字が存在しないことに注意してください)。したがって、string.Splitの使用はオプションではありません。各グループの文字数はさまざまで、グループの数もさまざまです。次の式を使用しています:

([ABCDEFGHJKLMNPQRSTVXYZ0123456789]{8}-?){3}

これは、それぞれ8文字の正確に3つのグループに一致します。多かれ少なかれ、マッチに失敗します。 これは、入力と正しく一致する限り機能します。ただし、Splitメソッドを使用して各文字グループを抽出すると、最終的なグループが取得されます。 RegexBuddyは、キャプチャグループ自体を繰り返したため、繰り返しグループの周りにキャプチャグループを配置する必要があると文句を言います。ただし、これを実行しようとしても、目的の結果が得られません。私は次のような式を試しています:

(([ABCDEFGHJKLMNPQRSTVXYZ0123456789]{8})-?){4}

ただし、これは機能しません。

コードで正規表現を生成するため、グループの数だけ正規表現を拡張できましたが、よりエレガントなソリューションを望んでいました。


文字セットにはアルファベット全体が含まれていないことに注意してください。これは、製品アクティベーションシステムの一部です。そのため、誤って数字または他の文字として解釈される可能性のある文字は削除されます。例えば文字「I」、「O」、「U」、および「W」は文字セットに含まれていません。

ユーザーがトップ入力する必要がないため、ハイフンはオプションですが、ユーザーがコピーを完了した場合はハイフンを使用できます。貼り付けます。

役に立ちましたか?

解決 2

私が求めていた答えを見つけました。ここに私の作業コードがあります:

    static void Main(string[] args)
    {
        string pattern = @"^\s*((?<group>[ABCDEFGHJKLMNPQRSTVXYZ0123456789]{8})-?){3}\s*<*>quot;;
        string input = "H3Y5NC8E-TGA5B6SB-2NVAQ4E0";
        Regex re = new Regex(pattern);
        Match m = re.Match(input);

        if (m.Success)
            foreach (Capture c in m.Groups["group"].Captures)
                Console.WriteLine(c.Value);
    }

他のヒント

ところで、[ABCDEFGHJKLMNPQRSTVXYZ0123456789]文字クラスをより読みやすい減算文字クラスに置き換えることができます。

[[A-Z\d]-[IOUW]]

このような3つのグループに一致させたい場合、正規表現でこのパターンを3回使用し、キャプチャした1、2、3サブグループを使用して新しい文字列を形成してみませんか?

([[A-Z\d]-[IOUW]]){8}-([[A-Z\d]-[IOUW]]){8}-([[A-Z\d]-[IOUW]]){8}

PHPでは戻ります(.NETがわかりません)

return "$1 $2 $3";

質問と与えられた回答を確認した後、私はこれを思いつきました:

RegexOptions options = RegexOptions.None;
Regex regex = new Regex(@"([ABCDEFGHJKLMNPQRSTVXYZ0123456789]{8})", options);
string input = @"H3Y5NC8E-TGA5B6SB-2NVAQ4E0";

MatchCollection matches = regex.Matches(input);
for (int i = 0; i != matches.Count; ++i)
{
    string match = matches[i].Value;
}

&quot;-&quot;オプションであり、含める必要はありません。最後に{4}を何に使用していたのかわかりませんか?これにより、必要なものに基づいて一致が検索され、MatchCollectionを使用して各一致にアクセスして文字列を再構築できます。

正規表現を使用する理由グループが常に-で分割されている場合、Split()を使用できませんか?

これが意図したものではない場合は申し訳ありませんが、文字列には常にグループを区切るハイフンがあり、正規表現を使用する代わりにString.Split()メソッドを使用できませんか?

Dim stringArray As Array = someString.Split("-")

有効なブロックの定義特性は何ですか?本当に役立つためには、それを知る必要があります。

私の一般的な提案は、最初のステップで文字セットを検証してから、期待に基づいて別のメソッドで分割して解析します。これがWebサイト/アプリにある場合は、フロントエンドでASP Regex検証を使用し、バックエンドで分割できます。

group(i).valueを使用してグループの値をチェックするだけの場合、最後のもののみを取得します。ただし、グループがキャプチャされたすべての時間にわたって列挙する場合は、以下に示すようにgroup(2).captures(i).valueを使用します。

system.text.RegularExpressions.Regex.Match("H3Y5NC8E-TGA5B6SB-2NVAQ4E0","(([ABCDEFGHJKLMNPQRSTVXYZ0123456789]+)-?)*").Groups(2).Captures(i).Value

マイク、

文字グループ内で選択した文字セットを使用できます。必要なのは、「+」を追加することだけです;すべてのグループをキャプチャする修飾子。以前の回答を参照して、[A-Z0-9]を必要なものに変更してください(つまり[ABCDEFGHJKLMNPQRSTVXYZ0123456789])

このパターンを使用できます:

Regex.Split("H3Y5NC8E-TGA5B6SB-2NVAQ4E0", "([ABCDEFGHJKLMNPQRSTVXYZ0123456789]{8}+)-?")

ただし、結果の配列から空の文字列を除外する必要があります。 MSDN からの引用:

  

複数の一致が互いに隣接している場合、空の文字列が配列に挿入されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top