0

私は正規表現にかなり慣れていません。ちなみに私は何かを学びましたが、それでも知識を注いでいます!

だから私はそれがどのように機能するかについてあなたに説明を求めたいです!

私が次の文字列を持っていると仮定すると、ご覧のとおり、それらは互いに少し異なる方法でフォーマットできますが、非常に似ています!

DTSTART;TZID="America/Chicago":20030819T000000
DTEND;TZID="America/Chicago":20030819T010000
DTSTART;TZID=US/Pacific
DTSTART;VALUE=DATE

今、私は最初のAZブロックコロンののすべてを置き換えたいので、たとえば

DTSTART:20030819T000000
DTEND:20030819T010000
DTSTART
DTSTART

だから私の非常に初心者の知識で私はこのくだらない正規表現を解決しました!:-(

preg_replace( '/^[A-Z](?!;[A-Z]=[\w\W]+):$/m' , '' , $data );

しかし、なぜこの正規表現は機能しないと確信しているのですか?:-)

plsは私を助けます!

PS:質問のタイトルはかなり説明されています。たとえば、よく知られている文字列ブロックを使用して別のブロックと一致させる方法も知りたいです...

preg_replace( '/^[DTSTART](?!;[A-Z]=[\w\W]+):$/m' , '' , $data );

..削除せずDTSTART

時間をありがとう!

よろしくルカフィロソフィ

4

4 に答える 4

1

セミコロンとコロンまたは行の終わりの間のすべてを削除したいですよね?だからそれをあなたの表現として使ってください。あなたは物事を複雑にしすぎています。

preg_replace('/(?:;.+?:)|(?:;.+?$)/m','',$data);

とてもシンプルな表現です。一致(?:;.+?:)または(?:;.+?$)、ターミネータのみが異なる(最初の1つはコロンまで一致し、2番目の1つは行の終わりまで一致します)。

それぞれは、セミコロンで始まり、しぶしぶすべての文字を読み取り、ターミネータで停止する非キャプチャグループです。あなたの説明によれば、これに一致するものはすべて取り外し可能です。

于 2010-04-28T14:51:05.250 に答える
1

一致したパターンの一部を置換で保持する場合は、その周りに括弧を付けてから、$ 1(またはグループ化)で参照します。

例えば:

s/^(this is a sentence) to edit/$1/

「これは文です」

于 2010-04-28T14:52:11.730 に答える
1

この例は、問題と同じように機能することを確認できます

\ w +):(?P \ d +)/'、$ str、$ matches); /*これはPHP5.2.2(PCRE 7.0)以降でも機能しますが、*下位互換性のために上記の形式をお勧めします* / // preg_match('/(?\ w +):(?\ d +)/'、$ str、$ matches); print_r($ matches); ?>
The above example will output:

Array
(
    [0] => foobar: 2008
    [name] => foobar
    [1] => foobar
    [digit] => 2008
    [2] => 2008
)

したがって、数字だけが必要な場合は、$matches[digit]を出力する必要があります。

于 2010-04-28T14:54:26.397 に答える
1

次のような比較的単純な正規表現を使用できます。

$subject = 'DTSTART;TZID="America/Chicago":20030819T000000
DTEND;TZID="America/Chicago":20030819T010000
DTSTART;TZID=US/Pacific
DTSTART;VALUE=DATE';

echo preg_replace('/^[A-Z]+\K[^:\n]*/m', '', $subject) . PHP_EOL;

行の先頭で一連の大文字を探し、一致の開始点\Kをそれらの末尾にリセットし(つまり、削除する部分)、コロンまたは改行以外のものと一致します。これらの一致したパーツは、空の文字列に置き換えられます。

上記からの出力は次のようになります

DTSTART:20030819T000000
DTEND:20030819T010000
DTSTART
DTSTART

興味のある行が最初から始まる場合、DTSTARTまたはDTEND一致するものについてより正確になる可能性がありますが(たとえば^DT(?:START|END))、[A-Z]明らかに両方をカバーしています。

于 2010-04-28T15:16:00.270 に答える