匹配感叹号'字符'之前没有单词'

时间:2015-02-09 21:01:29

标签: php regex

我想从字母前面的字符串中删除每个!个字符。为完成此任务,我考虑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 个答案:

答案 0 :(得分:2)

您希望在

时删除!
  • 之前没有任何单词突破(如foo !
  • 或之后有一个单词分隔符(如!foo

这给出了:

\B!|!\b

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

答案 1 :(得分:0)

([^a-z])\!+|\!+([a-z]),替换$1$2应该匹配多个!前面没有字母(\ W)或者紧跟在(\ w)之后的字母。< / p>

如果您的正则表达式语言采用正向前瞻/后观,那么您可以使用(?<=[^a-z])\!+|\!+(?=[a-z])而不使用替换字符串。