如何正则表达式匹配不属于模式的单个字符?
How can I regex match a single character that is not part of a pattern?
如果我有这样的字符串:
ć;
Johć; Smith <js@comms.com>;
;boomʿ;woopwoop;
;
并且我希望匹配所有不属于该 html 实体的分号,我可以使用什么正则表达式技术?
我有几次以消极的眼光接近了,到目前为止我最好的尝试如下:
(?<!&#.+?[^;]);
然而,这不会匹配将这场胜利带回家所需的所有分号。
我正在使用 php。
我正在考虑先用标记替换 html 个实体,然后替换分号,最后将实体替换回字符串中。
这看起来很笨拙和不雅所以我宁愿用正则表达式来做,即使它有点笨拙。
编辑:@sln 提供了一个正则表达式,它将 select 几乎所有实体,正如他指出的那样,这应该是试图避免某些事情的第一步。
(?i)[%&](?:[a-z]+|(?:#(?:[0-9]+|x[0-9a-f]+)));
虽然问题是关于如何 select 单个字符,但在字符串中找到的字符除外,我提供的数据的上下文使它成为一个非常有用的正则表达式,可以了解并附加到这个问题。
您可以匹配并跳过实体并匹配所有其他上下文中的分号:
$s = preg_replace('~&#\w+;(*SKIP)(*F)|;~', 'NEWTEXT', $s);
详情:
&#\w+;
- &#
,后跟 1 个以上的字符和 ;
(*SKIP)(*F)
- 当前匹配失败的两个 PCRE 动词,并在文本匹配后继续寻找下一个匹配
|
- 或
;
- 一个分号。
如果我有这样的字符串:
ć;
Johć; Smith <js@comms.com>;
;boomʿ;woopwoop;
;
并且我希望匹配所有不属于该 html 实体的分号,我可以使用什么正则表达式技术?
我有几次以消极的眼光接近了,到目前为止我最好的尝试如下:
(?<!&#.+?[^;]);
然而,这不会匹配将这场胜利带回家所需的所有分号。
我正在使用 php。
我正在考虑先用标记替换 html 个实体,然后替换分号,最后将实体替换回字符串中。
这看起来很笨拙和不雅所以我宁愿用正则表达式来做,即使它有点笨拙。
编辑:@sln 提供了一个正则表达式,它将 select 几乎所有实体,正如他指出的那样,这应该是试图避免某些事情的第一步。
(?i)[%&](?:[a-z]+|(?:#(?:[0-9]+|x[0-9a-f]+)));
虽然问题是关于如何 select 单个字符,但在字符串中找到的字符除外,我提供的数据的上下文使它成为一个非常有用的正则表达式,可以了解并附加到这个问题。
您可以匹配并跳过实体并匹配所有其他上下文中的分号:
$s = preg_replace('~&#\w+;(*SKIP)(*F)|;~', 'NEWTEXT', $s);
详情:
&#\w+;
-&#
,后跟 1 个以上的字符和;
(*SKIP)(*F)
- 当前匹配失败的两个 PCRE 动词,并在文本匹配后继续寻找下一个匹配|
- 或;
- 一个分号。