0

読んでいるファイルがあり、ファイル全体で特定のパターンを検索しています。サンプル行は次のとおりです。

DATA "1354236384craan18p.1354236392craan18p.1354668684AR_ESCALATORCase HD0347023 was automatically closed on 5/12/2012 1:51:24 p.m.." "IT Services | File Services | Recovery"

私が欲しいのは、"IT Services | File Services | Recovery" セクションのみを提供する正規表現を作成することです。

次の正規表現とコードがありますが、機能しません - 何かアイデアはありますか?

$whole_wk_file = file_get_contents('Work.arx');

$pattern1 = '/\"[^\"\|]+\|[^\"\|]+\|[^\"\|]+\"/';

preg_match_all($pattern1, $whole_wk_file, $matches_wk, PREG_PATTERN_ORDER);

print_r($matches_wk{0});

これもPHPです。

4

3 に答える 3

0

正規表現にこれを試してください

'/"(([^"|]+\|){1,}[^"]+)"/'

テキストは、各試合のグループ1に含まれるか、おそらくこれだけになります。

'/(?<=")(?:[^"|]+\|){1,}[^"]+(?=")/'

グループなしで一致します

于 2012-12-11T02:58:15.620 に答える
0

幸い、phpのマルチバイト関数はWindows-1252文字エンコードをサポートしているようです。これは私が思いついたものです..これがうまくいくことを願っています

$whole_wk_file = file_get_contents('Work.arx');

$pattern1 = '/\"[^\"\|]+\|[^\"\|]+\|[^\"\|]+\"/';

mb_internal_encoding("Windows-1252");
mb_eregi($pattern1, $whole_wk_file, $matches_wk);

print_r($matches_wk);
于 2012-12-11T03:48:13.483 に答える
0

あなたの正規表現は、必要なすべての一致を見つけるようですが、たまたま 2 つのパイプが含まれている引用されたセクションでも誤検知が発生します ( |)。あなたはコメントで、すべての一致はそれを囲む行の最後にあるべきだと言ったので、アンカーを追加することでその問題を処理する必要があります:

'/"[^"|]+\|[^"|]+\|[^"|]+"[ ]*$/m'

m修飾子は、$アンカーが行の境界で一致するようにします。これ[ ]*は、ファイルのすべての行がスペース文字で終わっているように見えるためです。\s*代わりに使用することもできましたが、それは改行とスペースに一致します。$次に、アンカー ( ) がその仕事を行えるように、それらをすぐに返す必要があります。その精神で、改行を完全に除外することはあなたの時間の価値があるかもしれません:

'/"[^"|\r\n]+\|[^"|\r\n]+\|[^"|\r\n]+"[ ]*$/m'

また、不要なバックスラッシュの束を取り除きました。

これらのがらくた文字については、 Kelly Copleyが正しいと思います。それはエンコーディングの問題ではありません (もしそうなら、修正するには遅すぎます)。気になる部分への影響はないようです。

于 2012-12-11T06:50:11.077 に答える