3

サーバー上のログファイルを読み込むWindowsコマンドラインプログラムをC#で実行しています。ログファイルはスペースで区切られ(これを変更することはできません)、次のようなレコードが含まれています。

74.57.205.141 - - [30/Mar/2012:00:03:04 +0000] "GET /7/961/148606/v1/00.akacast.akamaistream.net/00-radio-128" 200 1758815 "-" "iTunes/10.5.3 (Windows; Microsoft Windows 7 x64 "R2" Business Edition Service Pack 1 (Build 7601)) AppleWebKit/534.52.7"  102

行が「/iTunesはユーザーエージェント文字列の始まりです。AppleWebKit/534.52.7まで行き、そこで終わるはずです。問題は、一部のユーザーエージェント文字列では、不正な引用が発生することです。ユーザーエージェント文字列に挿入されます。この例では、その不正な引用は「R2」です。

ただし、常にR2であるとは限りません。他のエージェント文字列も余分な引用符を挿入する可能性があるため、「R2」を見つけてR2に置き換えることはできません。

私が有効な文字列で思いついたパターンは、常に6つの引用符があり、すべての偶数の引用符の後にスペースがあるというものです。

1番目の引用-開始文字列2番目の引用-3番目の引用の後にスペースを含む終了文字列-開始文字列4番目の引用-5番目の引用の後にスペースを含む終了文字列-開始文字列6番目の引用-スペースを含む終了文字列

無効な文字列は常にこのパターンに従います。

1番目の引用-開始文字列2番目の引用-3番目の引用に続くスペースで文字列を終了-開始文字列4番目の引用-5番目の引用に続くスペースで文字列を終了-開始文字列6番目の引用-7番目の引用に続くスペースなしで文字列を終了-開始文字列8番目の引用-で文字列を終了次のスペース

私が必要としているのは、文字列を検索して引用符の位置をたどり、その無効なパターンを探し、6番目と7番目の位置から引用符を削除する方法です。私は良い正規表現がうまくいくかもしれないと思っていましたが、私はそれらにあまり良くなく、まだうまくいくものを思いつきませんでした、言うまでもなく、正規表現は6番目と7番目の位置からそれらの引用符を削除するつもりはありません。

編集

これは単純すぎるかもしれませんが、インデックス操作を行うことで特定の問題を解決することができました。残念ながら、正規表現ソリューションを機能させることができませんでした:(

作業コード:

string str = "74.57.205.141 - - [30/Mar/2012:00:03:04 +0000] \"GET /7/961/148606/v1/00.akacast.akamaistream.net/00-radio-128\" 200 1758815 \"-\" \"iTunes/10.5.3 (Windows; Microsoft Windows 7 x64 \"R2\" Business Edition Service Pack 1 (Build 7601)) AppleWebKit/534.52.7\"  102";

int[] indexes = Enumerable.Range(0, str.Length).Where(x => str[x] == '"').ToArray();

            if (indexes.Length > 6)
            {
                //need to remove extra quotes from the 6th position and 7th position.
                //remove the 7th position first to prevent the index from changing on the quotes we need to remove.
                str = str.Remove(indexes[6], 1).Remove(indexes[5], 1);
            }
4

2 に答える 2

0

正規表現を使用して、引用符が追加された文字列を検出できます。

(.+)(\s*".+"\s*)(.+)(\s*".+"\s*)(\s*".+"\s*)(.*)(\s*".+"\s*)(.+)

これは、次のような文字列にのみ一致します

UnquotedStart"QuotedText1" UnquotedText "QuotetText2" "QuotetText3" ROUGETEXT "QuotetText4"   UnquotetEnd

一致するグループから正しい文字列を再構築できるようになりました。

于 2012-07-19T16:31:59.677 に答える
0

これはどう:

".*?".*?".*?".*?"(.*)"

基本的に合ってる

[ignore beginning]
[First Quote Pair]
[AnythingInBetween]
[Second Quote Pair]
[AnythingInBetween]
[Quote]
GROUPS YOUR FINAL STRING HERE until
[LastQuote in the line]

次に、内側の引用符を削除するだけです。

これが機能するのは、最初の 2 つの引用符のペアに貪欲でない正規表現を使用し、次に最後の引用符の一致に貪欲な正規表現を使用するためです。したがって、最終的な一致では、最後の引用符に到達するまですべての引用符が無視されます。

于 2012-07-19T16:08:53.110 に答える