我需要正则表达式方面的帮助。我想将所有出现的5%
或7%
或183%
或替换99%
为``(空字符串),但如果出现的是0%
或100%
(可能有几十个我想保留的出现),我不想做任何事情。
例如:
aaa 0% bbb
应该变成aaa 0% bbb
(没有改变)
然而
aaa 40% bbb
应该成为aaa bbb
我想出了一个使用负向后视的正则表达式,但它只会删除%
符号,而不会删除数字。这是正则表达式:
替换(?<!(0|100))%
为 ``(空字符串)
上述正则表达式应用于字符串时aaa 40% bbb
将返回aaa 40 bbb
。
此正则表达式模式将保留
0%
和100%
,并删除任何其他百分比(数字、符号和以下空格)。该模式首先确保前面有空格。然后它将尝试匹配
100%
或0%
后面跟着空格。如果匹配,则整个匹配项将被匹配的100%
或0%
后面跟着匹配的空格字符替换(即匹配的字符串不会发生变化)。如果没有匹配,它将匹配任何后面跟着%
空格的数字并将其替换为空字符串,从而有效地删除匹配的百分比和一个空格字符。REGEX(PCRE2 风格)
正则表达式演示: https://regex101.com/r/VCOPJg/3
笔记:
(?<=\s)
正向后视。如果前面有一个空格字符 (```````),则匹配。(?:...)
非捕获组。((?:10)?0%\s)
捕获组(...)
号1
。在$replacement
字符串中称为$1
。(?:10)?
非捕获组。可选?
,匹配 0 或 1 次。匹配文字 1,然后匹配文字 0。0%
匹配文字0
,后跟文字%
。|
或者。\d+%\s
匹配 1 个或多个 (+
) 数字 (\d
) 后跟一个空格字符 (\s
)。测试字符串
结果:
您的正则表达式没有按照您期望的方式执行,因为后向断言
(?<!(0|100))
不消耗任何资源。您可以使用模式来匹配要删除的内容:
并用空字符串替换。
正则表达式匹配:
\b
单词边界可防止部分单词匹配(?!
负向前瞻,断言当前位置右侧的内容不是(?:10)?0%
匹配可选的 10,后跟必需的 0,然后是%
)
关闭前瞻\d+%
匹配 1+ 个数字,后跟%
查看regex101 演示
如果数字前面和百分号后面没有任何内容,则可以使用空格边界,断言左侧和右侧没有非空格字符:
查看正则表达式 101 演示
在匹配模式之前使用负向前瞻,而不是负向后瞻。
演示