0

次のようなオブジェクト一致を使用して、正規表現で定義されたグループごとに文字列を分割しようとしています。

if(match.Success)
{
    foreach (Group group in match.Groups)
    {
        foreach(Capture capture in group.Captures)
        {
            //...
        }
    }
}

私が一致するはずの文字列は次のように形成されます:「で始まるかどうか」、任意の回数の文字(「、\ r、\ nなどを含む)」次に、任意の文字を何度でも、別の;、スペースと数字の組み合わせを少なくとも1回終了します。

この正規表現を使用しています:

("?[.|\n|\r|\r\n]*"?);(.*);([\d| ]*)(;([\d| ]*))*

最初のグループは任意の文字を含む文字列で、2番目のグループはテキスト/数字のみの文字列です。3番目のグループは常にここにあり、スペースと数字が混在しています。スペースと数、グループ4、56などでそれらを取得します。

私が一致しなければならない文字列の例:

"VIS METAUX TETE CYLINDRIQUE FENDUE EN ACIER ZINGUE DIAMETRE M10"; Longueur 60mm; 0046 10 30

"Visàmétauxàtêtecylindriquefendue。Norme:DIN84";Diamètre3mm。長さ16mm;0046 3 16

"Tournevis Torx sur monture:10、15、20、25、30、40" ;; 0613 434 10; 0613 434 10; 0613 434 20

これはまったく機能しません。私が一致するグループが良いことはめったになく、どうすればそれができるのかわかりません。

4

1 に答える 1

1

これは、各「行」を個別の文字列として取得できる場合にのみ機能しますが、分割しようとするのではなく、正規表現を使用して各フィールドに一致させます。

// Unescaped regular expression is (?<=")[^"]*(?=")|(?<=^|;)[^;]*(?=$|;)
Regex r = new Regex(@"(?<="")[^""]*(?="")|(?<=^|;)[^;]*(?=$|;)");
foreach (Match field in r.Matches(csvLine))
   ... // do something with field.Value

正規表現は、「前後に引用符が付いた非引用符文字のロード、または前後にセミコロンまたは文字列の開始/終了が付いた非セミコロン文字のロード)に一致します。

于 2012-12-05T14:42:25.873 に答える