2015-02-09 25 views
1

我想刪除每個!字符,該字符串是之後不是一個單詞。爲了完成這個任務,我想着preg_replace()來執行正則表達式匹配。匹配'感嘆號'字符'不立即前面有一個單詞'

也就是說,我想一個文本以下褻瀆:

search! query ! !key!words that! acc!ept exclamation! marks! 

...成爲:

search! query keywords that! accept exclamation! marks! 

沒有必要採取雙+事件考慮進去,因爲我使用(![!]+)進行過濾 - 儘管如果有人知道需要考慮雙倍出現的解決方案,我很樂意歡迎它,因爲它不需要額外查找。

到目前爲止,我有(!\b)|(\s+!\s+)|(!\s+!)它 - 除了是在我看來有點古怪 - 作品幾乎完美,但有時刪除單詞之間的間距,生產的

search! querykeywords that! accept exclamation! marks! 

編輯

結果

解析字符串時,我需要考慮重音和/或大寫字符。

回答

2

要刪除一個!

  • 有之前沒有文字分隔符(如foo !
  • 或有後一個字中斷(如!foo

這給出:

\B!|!\b 

https://regex101.com/r/xF7bG6/1

+0

**好和清楚**。對於任何想知道的人來說,如果後續出現'!!'字符(這不是一個問題,正如我以前在原始問題中所述)。但是,將其更改爲'\ B!+ |!+ \ b'解決了這個問題 - 或者看起來像這樣 - http://www.regexr.com/3acqi – 2015-02-09 21:28:00

0

([^a-z])\!+|\!+([a-z]),替換$1$2應匹配多個!的前面沒有字母(\ W)或緊跟在後面(\ w)的字母。

如果您的正則表達式語言採取積極的lookaheads/lookbehinds,那麼您可以使用(?<=[^a-z])\!+|\!+(?=[a-z])而不使用替換字符串。

+0

我還沒有測試這個服務器端,但根據http://www.regexr.com/3acqc,這將產生'搜索querykeyords那! accpt驚歎!標記!'。 RegExr使用JavaScript來處理正則表達式,但不是基於Perl Regex方式的PHP和JavaScript? – 2015-02-09 21:14:56

+1

@JánosWeisz我將原來的替換字符串固定爲'$ 1 $ 2'並添加了一個替代方法。 – NextInLine 2015-02-09 21:15:53

+0

第二個非常接近目標,但不是空格,它將'query'和'keywords'合併在一起,產生與問題中相同的結果。我想沒有一個正則表達式的解決方案來決定使用「空間」還是什麼都不用,對吧?我對這個解決方案的另一個問題 - 忘記說明問題,現在正在糾正 - 是字符串中可能有重音和/或大寫字符。 – 2015-02-09 21:19:32