0

まだ正規表現を学んでいて、先読みの概念に頭を悩ませています。ここでの私の質問と同様のデータ - Matching multiple lines up until a sepertor line? 、ユーザーから次の行が渡されたとします。

 0000AA.The horizontal coordinates are valid at the epoch date displayed above.
 0000AA.The epoch date for horizontal control is a decimal equivalence
 0000AA.of Year/Month/Day.
 0000AA
 [..]

したがって、非常に単純な正規表現は@^[0-9]{4}[A-Z]{2}\.(?<noteline>.*)であり、すべての行が表示されます。素晴らしい。:)しかし、次の行を見て、その行に「.」なしのコードがあるかどうかを教えてくれる先読み(または条件?)が欲しいです。(つまり、次の行が一致する場合@^[0-9]{4}[A-Z]{2}[^\.]

先読みを試してみると、最初の 2 行 (次の行のコードの後に​​「.」があるため) でヒットしますが、最後の行ではヒットしません。

編集:上記の正規表現、または以下の正規表現を使用すると、すべての行が表示されますが、空白行(AA0000コードの行で、その後に「。」がない行)が続くかどうかを知りたいです。たとえば、行の一致に到達した場合、その行の後に空白行が続くかどうか (またはそうでないか)of Year/Month/Dayを知りたいです。(高レベルの例として、スペースまたは空ではないグループ化名のように。)

編集 2 :「先読み」という用語を誤用している可能性があります。.NET の正規表現に戻ると、Alternation Construct と呼ばれるものがありますが、ここで使用できるかどうかはわかりません。

ありがとう!
マイク。

4

2 に答える 2

0

オプションを適用しますRegexOptions.Multiline。文字列全体の最初と最後ではなく、ervery行の最初と最後に一致するように意味を変更し^ます。$

var matches = Regex.Matches(input, 
                            @"^[0-9]{4}[A-Z]{2}\..*$?(?!^[0-9]{4}[A-Z]{2}[^.])",
                            RegexOptions.Multiline);

今後のネガティブな見方は

find(?!suffix)

接尾辞の前にない位置に一致します。角かっこ内のドットをエスケープしないでください[ ]。ブラケットは、とにかくほとんどの文字の特別な意味を無効にします。

.*$?また、現在の行の終わりまでパターンを一致させることも追加しました。怠惰?にするために必要です。それ以外の場合は貪欲です。つまり、できるだけ多くの文字を取得し、一度に複数の行に一致させようとします。*


数字の部分だけが必要な場合は、括弧で囲むことでグループにまとめることができます。

(^[0-9]{4}[A-Z]{2})\..*$?(?!^[0-9]{4}[A-Z]{2}[^.])

その後、このようなグループを取得できます

string number = match.Groups[1].Value;

注:グループ#0は、一致全体を表します。

于 2013-02-11T20:42:08.453 に答える
0

多くの調査とヒットとミスを行った後、コードで実行する方が簡単である可能性があります。

控えるために、私は複数行の文字列 (ドキュメント) を見ていました。ここでは、すべての行の前に 6 桁のコードがありました。一部の行 (私が興味を持っている行) には「.」が含まれています。6 桁のコードの後に​​テキストを開きます。次の行にフリーテキスト エントリがないかどうかを知らせるフラグと共に、グループ内の各行を取得する方法があることを期待していました。(6 桁のコードの後に​​ '.' はありません。) つまり、2 行のデータ入力では、ドキュメントで 2 つの一致が得られます。最初の一致では、「notetext」というグループに行のテキストが含まれ、グループ「lastline」は空になります。2 行目には、入力されたメモの 2 番目の部分が 'notetext' に含まれ、グループ 'lastline' には何かが含まれます (内容は何でもかまいません)。

私が理解していることから、先読みはゼロ幅のアサーションであるため、一致した場合、戻り値はまだ空です。先読みを使用しないと、「lastline」の一致によって次の行のコードが消費され、「notetext」がその行をスキップします (1 行おきテキストが表示されます)。 .

この時点で、すべての行を単純に取得し、メモの最後に到達するまでテキストを追加する方が (コード的に) 簡単です。(正規表現に一致する行をループするのではなく、200行を超えることはできないドキュメント全体をループし、将来の変更のためにコードを読みやすくすることは、正規表現が得ることができるわずかな速度の利点よりも重要です.

みんなありがとう - -マイク。

于 2013-02-15T18:31:46.287 に答える