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 );

但为什么我确定这个正则表达式不起作用!?:-)

请帮助我!

PS:问题的标题很清楚,我也想知道如何使用众所周知的字符串块来匹配另一个......

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

..没有删除DTSTART

谢谢你的时间!

问候卢卡·菲洛索菲

4

4 回答 4

1

如果您想在替换中保留部分匹配的模式,请在其周围加上括号,然后通过 $1 (或任何分组)引用它。

例如:

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

给出“这是一个句子”

于 2010-04-28T14:52:11.730 回答
1

您可以查看此示例的工作方式与您的问题类似

\w+): (?P\d+)/', $str, $matches); /* 这也适用于 PHP 5.2.2 (PCRE 7.0) 及更高版本,但是 * 建议使用上述形式以实现向后兼容性 */ // preg_match('/(?\w+): (?\d+)/', $ str,$匹配);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

您想删除分号和冒号或行尾之间的所有内容,对吗?所以用它作为你的表达方式。你把事情复杂化了。

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

这是一个很简单的表达。match(?:;.+?:)(?:;.+?$),它们的区别仅在于它们的终止符(第一个匹配到冒号,第二个匹配到行尾)。

每个都是以分号开头的非捕获组,不情愿地读入所有字符,然后在终止符处停止。根据您的描述,与此匹配的所有内容都可以移除。

于 2010-04-28T14:51:05.250 回答
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

如果您感兴趣的行仅以DTSTARTor开头,DTEND那么我们可以更准确地确定要匹配的内容(例如^DT(?:START|END)),但[A-Z]显然涵盖了这两者。

于 2010-04-28T15:16:00.270 回答