簡體   English   中英

正則表達式如何匹配字符串中除“ stop”以外的所有單詞

[英]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)|.

regex101上的演示

或序列: (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.

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