簡體   English   中英

使用字符串作為模式,但將其從中刪除

[英]Use String for Pattern but Exclude it from Being Removed

我在regex上還很陌生,我已經學到了一些東西,但是仍然很豐富!

所以我想請您澄清一下它的工作原理!

假設我有以下字符串,如您所見,可以將它們的格式設置彼此之間的差異很小,但是它們非常相似!

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

感謝您的時間!

問候盧卡·菲洛索菲

您想刪除分號和冒號或行尾之間的所有內容,對嗎? 因此,將其用作您的表情。 您太復雜了。

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

這是一個非常簡單的表達。 匹配項(?:;.+?:)(?:;.+?$) ,兩者的區別僅在於其終止符(第一個匹配至一個冒號,第二個匹配至行尾) 。

每個都是非捕獲組,以分號開頭,不情願地讀取所有字符,然后在終止符處停止。 與此匹配的所有內容都可以根據您的描述進行移動。

如果要保留替換中匹配模式的一部分,請在其周圍加上括號,然后用$ 1(或其中的任何一個分組)引用它。

例如:

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

給出“這是一個句子”

您可以像檢查問題一樣查看此示例工作

\\ w +):(?P \\ d +)/',$ str,$ matches); / *這在PHP 5.2.2(PCRE 7.0)及更高版本中也適用,但是*建議使用上述形式以實現向后兼容* / // preg_match('/(?\\ w +):(?\\ d +)/',$ str,$ matches); 的print_r($比賽); ?>
 The above example will output: Array ( [0] => foobar: 2008 [name] => foobar [1] => foobar [digit] => 2008 [2] => 2008 ) 

因此,如果您只需要數字,就需要打印$ matches [digit]

您可以使用相對簡單的正則表達式,如下所示。

$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

如果您感興趣的行僅以DTSTARTDTEND那么我們可以更精確地確定要匹配的行(例如^DT(?:START|END) ),但[AZ]顯然涵蓋了這兩個行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM