[英]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
如果您感興趣的行僅以DTSTART
或DTEND
那么我們可以更精確地確定要匹配的行(例如^DT(?:START|END)
),但[AZ]
顯然涵蓋了這兩個行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.