Используйте String для Pattern, но исключите его из списка - PullRequest
0 голосов
/ 28 апреля 2010

Я довольно новичок в регулярных выражениях, я, кстати, кое-что узнал, но все еще полон знаний!

так что я хочу попросить вас уточнить, как это работает!

при условии, что у меня есть следующие строки, как вы можете видеть, они могут быть отформатированы немного по-другому, но они очень похожи!

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

Теперь я хочу заменить все между первым блоком A-Z и двоеточием , поэтому, например, я бы оставил

DTSTART:20030819T000000
DTEND:20030819T010000
DTSTART
DTSTART

Итак, насколько я знаю, я разработал это дерьмовое регулярное выражение! : - (

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

но почему я уверен, что это регулярное выражение не сработает !? : -)

Пожалуйста, помогите мне!

PS: название вопроса довольно объяснено, я также хочу знать, как, например, использовать хорошо известный строковый блок для соответствия другому ...

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

.. без удаления DTSTART

Спасибо за время!

С уважением Лука Философи

Ответы [ 4 ]

1 голос
/ 28 апреля 2010

Вы можете использовать относительно простое регулярное выражение, подобное следующему.

$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], очевидно, охватывает оба из них.

1 голос
/ 28 апреля 2010

Если вы хотите сохранить часть сопоставленного шаблона в подстановке, поместите вокруг него круглые скобки, а затем укажите его на 1 доллар (или в зависимости от того, какая группа будет).

Например:

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

дает "это предложение"

1 голос
/ 28 апреля 2010

Вы можете проверить этот пример работы так же, как ваша проблема

\ w +): (? P \ d +) / ', $ str, $ match); / * Это также работает в PHP 5.2.2 (PCRE 7.0) и позже, однако * приведенная выше форма рекомендуется для обратной совместимости * / // preg_match ('/ (? \ w +): (? \ d +) /', $ str, $ совпадений); print_r (соответствует $); ?>
The above example will output:

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

, поэтому, если вам нужна только цифра, вам нужно напечатать $ match [цифра]

1 голос
/ 28 апреля 2010

Вы хотите удалить все между точкой с запятой и двоеточием или концом строки, верно? Так что используйте это как выражение. Вы слишком усложняете вещи.

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

Это довольно простое выражение. Либо соответствует (?:;.+?:), либо (?:;.+?$), которые отличаются только своим терминатором (первый соответствует двоеточию, второй - до конца строки).

Каждая группа представляет собой группу без захвата, которая начинается с точки с запятой, неохотно читает все символы, а затем останавливается на терминаторе. Все, что соответствует этому, является съемным согласно вашему описанию.

...