如何正则表达式匹配不属于模式的单个字符?

How can I regex match a single character that is not part of a pattern?

如果我有这样的字符串:

&#263;; Joh&#263;; Smith <js@comms.com>; ;boom&#703;;woopwoop; ;

并且我希望匹配所有不属于该 html 实体的分号,我可以使用什么正则表达式技术?

我有几次以消极的眼光接近了,到目前为止我最好的尝试如下:

(?<!&#.+?[^;]);

然而,这不会匹配将这场胜利带回家所需的所有分号。

我正在使用 php。

我正在考虑先用标记替换 html 个实体,然后替换分号,最后将实体替换回字符串中。

这看起来很笨拙和不雅所以我宁愿用正则表达式来做,即使它有点笨拙。

编辑:@sln 提供了一个正则表达式,它将 select 几乎所有实体,正如他指出的那样,这应该是试图避免某些事情的第一步。

(?i)[%&](?:[a-z]+|(?:#(?:[0-9]+|x[0-9a-f]+)));

虽然问题是关于如何 select 单个字符,但在字符串中找到的字符除外,我提供的数据的上下文使它成为一个非常有用的正则表达式,可以了解并附加到这个问题。

您可以匹配并跳过实体并匹配所有其他上下文中的分号:

$s = preg_replace('~&#\w+;(*SKIP)(*F)|;~', 'NEWTEXT', $s);

regex demo

详情:

  • &#\w+; - &#,后跟 1 个以上的字符和 ;
  • (*SKIP)(*F) - 当前匹配失败的两个 PCRE 动词,并在文本匹配后继续寻找下一个匹配
  • | - 或
  • ; - 一个分号。