[英]How to match all words but “stop” in a string by regex
另一個正則表達式問題。 我使用PHP,並具有一個字符串: fdjkaljfdlstopfjdslafdj
。 您會看到中間有一stop
。 我只想替換除stop
之外的其他任何單詞。 我嘗試使用[^stop]
,但它還在字符串末尾包含s
。
謝謝大家的幫助。
我還想出了使用純RegEx方法的解決方案(在我的知識中對RegEx的了解是對的。PCRE動詞對我來說太高級了)。 但這需要2個步驟。 我不想混用PHP方法,因為有時作業不在編碼區域內,即Total Commander中的多重命名文件名。
讓我們看一下字符串: xxxfooeoropwfoo,skfhlk;afoofsjre,jhgfs,vnhufoolsjunegpq
。 例如,我想將所有foo
保留在此字符串中,並將其他所有non-foo
貪婪地替換為---
。
首先,我需要找到每個foo之間的所有非foo
: (?<=foo).+?(?=foo)
。 該字符串將變成xxxfoo---foo---foo---foolsjunegpq
,現在雙方都剩下non-foo
字了。
然后使用[^-]+(?=foo)|(?<=foo)[^-]+
。 這次: ---foo---foo---foo---foo---
。 除foo
所有單詞都變成了---
。
我只是不想包括“停止” ...
您可以使用PCRE動詞 (*SKIP)(*F)
跳過它,像這樣嘗試
stop(*SKIP)(*F)|.
或序列: (stop)(* SKIP)(* F)|(?:(?!(?1))。)+
或用於單詞: stop(* SKIP)(* F)| \\ w +
[^stop]
並不意味着任何非stop
文本。 這只是意味着任何字符不是內部的4個字符中的一個[...]
這是在這種情況下s,t,o,p
。
最好將不需要的文本分開:
$s = 'fdjkaljfdlstopfjdslafdjstopfoobar';
php> $arr = preg_split('/stop/', $s);
php> print_r($arr);
Array
(
[0] => fdjkaljfdl
[1] => fjdslafdj
[2] => foobar
)
您可以將其概括為任何模式:
(?<neg>stop)(*SKIP)(*FAIL)|(?s:.)+?(?=\Z|(?&neg))
只需將不需要的模式放在neg
組中即可。
此正則表達式將嘗試對任何字符位置執行以下操作:
(*SKIP)(*FAIL)
丟棄它,然后在該位置重新開始另一個匹配。 \\Z
) (?&neg)
) 這種方法比手動調整表達式慢,您可以以重復自己為代價獲得更好的性能,從而避免了遞歸:
stop(*SKIP)(*FAIL)|(?s:.)+?(?=\Z|stop)
但是當然,最好的方法是使用語言提供的功能:匹配不需要的字符串,然后使用代碼將其丟棄並保留其他所有內容。
在PHP中,可以使用PREG_OFFSET_CAPTURE
標志告訴preg_match_all
函數為您提供每個匹配項的偏移量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.