0

私のアプリケーションでは、ファイルを解析していくつかの文字列を置き換える必要があります。

1 「「」のある文字列」を強調していない
2 「何らかの文字列」を強調していない。「コメンター」
3 興味をそそらない ;「交換する文字列がない」

結果として、1行の最初の引用符から最後の引用符までの文字列全体が必要です。セミコロンから行末までの文字列全体が無視されます。

最初と最後のクォートを除いた結果。

1 "" " !" を含む文字列
2「何らかの文字列」
3 一致しない

私の正規表現パターンは引用符で囲まれたすべての文字列に対して機能しますが、セミコロン選択を実装するにはどうすればよいですか?

(?<=^.*?\")(.*)(?=\".*?$)

編集

(?<=^[^;]*?\")(.*)(?=\".*?$)

この正規表現は、セミコロンが先頭にある場合を想定して、最初と最後の引用符の間のすべての文字列を検索します。しかし、どうやって間にセミコロンを見つけましたか?

not intressting "some text" ;comment "not intressting"

マッチ

'some text'
4

2 に答える 2

0

これを試してみてください:

        string[] lines = File.ReadAllLines(@"Data.txt");
        string[] lines2 = lines
            .Select(line => Regex.Match(line, @"(?<!;)""((.(?!;\s*""))*)""", RegexOptions.None).Groups[1].Value)
            .Select(line => line.Length > 0 ? line : "no match")
            .ToArray();

この正規表現は、次のように解釈できます。引用符で始まり、直前にセミコロンがなく、パターンのセミコロンが続かないテキストを取得します-空白スペース-引用符で終わり、引用符で終わります

于 2013-03-04T08:50:12.237 に答える
0

予測

一致はシーケンスとして定義されます。

  • "入力文字列の最初から開始します。"これを1番目またはオープニングと呼びましょう"
  • ;開店前はありません"
  • ;シーケンスの最後"が奇数の場合、最初から数えて、シーケンスで許可され"ます。
  • ;シーケンスの最後"が偶数の場合、最初から数えて、シーケンスで許可されません"
  • "上記の条件を満たす最も遠いところで終了します。

解決

この正規表現(生の形式)との最初の一致を見つけます。

^(?> [^; "] *)"((?>(?> "[^";] *(?= "[^"] * $)| "[^";] * "| [^" ] *)+)) "

C#文字列リテラルの場合:

"^(?>[^;\"]*)\"((?>(?>\"[^\";]*(?=\"[^\"]*$)|\"[^\";]*\"|[^\"]*)+))\""

結果は最初のキャプチャグループになります。

説明

構文の説明:

  • (?>pattern)非バックトラッキング/所有格の部分式です。エンジンがバックトラックするのを防ぎます。これは最適化の一形態です。
  • (?=pattern)ゼロ幅の正の先読みです。前方の文字列patternがテキストを消費せずにに準拠していることを確認します。
  • |交替です。ここで注意したいのは、正規表現指向エンジンは各ルールを左から右にチェックし、一致するものが見つかった場合は他のルールを考慮しないということです。つまり、一致を決定する際には順序が重要です。
  • それらは非常に基本的なものなので、あなたは残りの部分に精通していると思います。

説明のために、非バックトラッキング最適化を削除した生の正規表現を使用します。

^ [^; "] *"((?: "[^";] *(?= "[^"] * $)| "[^";] * "| [^"] *)+) "

「1行の最初と最後の引用」の要件により、1行あたり最大1つの一致があります。

要件を分析することにより、関心のある部分の;のテキストに(要件の一部)または"(そうでない場合は引用符が最初になりません)を含めるべきではないことがわかります。したがって、^[^;"]*文字列の先頭から一致を固定し、最初の引用符まですべてを一致させるように記述できます"

これは引用符で囲まれた文字列部分であり、説明を簡単にするために分割されています。

「」
((
(?:
"[^";] *(?= "[^"] * $)
|
"[^";] * "
|
[^ "] *
)+
)。
「」

これらの3つのフラグメントに焦点を当てて、ボトムアップから説明を始めましょう。

"[^";] *(?= "[^"] * $)
"[^";] * "
[^ "] *

ここでのすべての場合において、最後に遭遇した引用は常に奇数の引用です。

  • [^"]*;:最後の引用符は奇数引用符であることが保証されているため、。を除くすべてを含めることができます"
  • "[^";]*":最後の引用符は奇数引用符であり、この後も奇数引用符です。この部分は、引用符が偶数の後に;許可されていない部分を扱います。
  • "[^";]*(?="[^"]*$):これは、文字列の引用符の数が奇数(> = 3)の場合を扱うトリッキーな部分です。偶数引用符の後に、文字列;の最後の引用符がないことを確認し"ました。「文字列の最後の引用符が続く"」は、先読みで実現されます(?="[^"]*$)

非バックトラッキング最適化を適用できるように、バックトラックを回避するためにフラグメント"[^";]*(?="[^"]*$)を前に配置する必要があります。"[^";]*"

于 2013-03-04T08:36:36.433 に答える