0

渡される検索文字列があります

例: "a+b",a, b, "C","d+e",ab,d

二重引用符 ("") で囲まれたすべてのサブ文字列を除外したい。上記のサンプル出力には、次が含まれている必要があります。

「a+b」、「C」、「d+e」

ループせずにこれを行う方法はありますか?

また、さらに処理を行うには、上記の値を含まない文字列を抽出する必要があります

例: a、b、ab、d

パフォーマンスへの影響を最小限に抑えてこれを行う方法に関する提案はありますか?

ご意見やご提案をお寄せいただきありがとうございます。

4

2 に答える 2

0

出力がどの程度正確かについて何も言わなかったので (コンマと余分な空白を保持する必要がありますか? そもそもコンマで区切られていますか? コンマで区切られておらず、削除しようとしているだけだと仮定しましょう「xyz」の出現:

    string strRegex = @"""([^""])+""";
    string strTargetString = @" ""a+b"",a, b, ""C"",""d+e"",a-b,d";
    string strOutput = Regex.Replace(strTargetString, strRegex, x => "");

すべての項目を削除します (余分なコンマと空白を残します)。

個々の一致が必要な場所で何かをしようとしている場合は、次のことを試してみてください。

var y = (from Match m in Regex.Matches(strTargetString, strRegex) select m.Value).ToList<string>();
y.ForEach(s => Console.WriteLine(s));

引用符で囲まれていないアイテムのリストを取得するには、正規表現パターンを逆にするか、最初のコード サンプルで replace メソッドを使用してから、カンマで分割し、空白をトリミングします (繰り返しますが、聞こえるコンマで分割していると仮定します)。あなたのように)

于 2012-12-11T03:04:32.467 に答える
0

まず、出力の最後にコンマを追加します。

"a+b",a, b, "C","d+e",a-b,d,

次に、次の正規表現を使用します。

((?<quoted>\".+?\")|(?<unquoted>.+?)),\s*

今、2 つの問題があります。冗談です!

ループを使用せずに一致を抽出する方法を見つける必要がありますが、少なくともグループを使用して、引用符で囲まれた文字列と引用符で囲まれていない文字列に分けられます。lamdba 式を使用してデータを取り出して結合することもできますが、引用符付きと引用符なしでそれぞれ 1 つずつですが、これは舞台裏でループを実行しているだけであり、単純な for ループよりも多くのオーバーヘッドが追加される可能性があります。ここでパフォーマンスを追求しようとしているように聞こえるので、時間をかけて各方法をテストし、最良の結果が得られる方法を確認してください。

于 2012-12-11T05:53:54.820 に答える