如何使用正则表达式排除字符串?

如何使用正则表达式排除字符串?

我有这个名为测试的文件:

http://edge.sharethis.com
http://edge.sharethis.com
https://timetosa.com
http://timetosa.com
https://webtest.es
holahttp.com
timetosa

我想要一个排除任何包含 timetosa 的行的表达式。

这是不允许的 : cat test | grep -v timetosa,因为我想在另一个程序中使用纯正则表达式。

我知道它与但无法找到正确的解决方案有关^,以影响不包含字符串 timetosa 的解决方案:

cat test | sed 's/^[timetosa]//g'并且cat test | sed 's/^(timetosa)//g'没有成功。

有人可以帮助我吗?

答案1

sed '/timetosa/d' <test

...会做的。或者:

sed -n '/timetosa/!p' <test

不过,尽管如此(无论允许与否):

grep -v timetosa <test

...将成为这三个解决方案中性能最高的解决方案 - 并且可能具有显着的优势。

感谢@Sparhawk,我找到了通往zaproxy 文档。基于此:

  • 网址正则表达式
    • 在里面包括*,排除自*面板和已登录/退出的指标验证面板中,您可以输入正则表达式来定义排除的 URL。

...以及以下内容,我猜您正在尝试过滤上下文?根据文档,您可以同时执行以下操作:排除列表:

  • 从上下文中排除
    • 这允许您管理将从上下文中排除的 URL。
    • 您只需为您不想包含但与一个或多个匹配的 URL 指定正则表达式包括正则表达式。

所以你可以排除一些您之前包含的内容。

尽管如此,这可能不是第一点完全无关紧要 - 文档中也提到了这一点附加组件部分:

  • 调用应用程序

    • 可以通过传递上下文信息来调用其他应用程序,例如所选消息的 URL。
    • 例如,nmap可以通过传递您希望其扫描的站点来调用。

    • 应用程序的配置使用选项 应用屏幕。

答案2

常规语言在补码下是闭合的,因此对于每个正则表达式,都存在一个与原始正则表达式不匹配的输入完全匹配的正则表达式。

然而,在最坏的情况下,与补语语言匹配的最小正则表达式的长度是原始正则表达式长度的指数。因此,虽然正则表达式保证存在,但不能保证它很简单。有可能通过算法计算如果你真的需要它。

锚定正则表达式的运算^符不相关。您可能会想到^字符集中,例如[^a-z]“任何不是小写字母的字符”。这只是字符集快捷表示法的一部分,对补充一组字符串没有帮助。

一些正则表达式引擎,例如 perl 或兼容且广泛使用的 PCRE,支持传统运算符之外的其他运算符,包括环视断言。否定先行断言提供了一种简单的方法来否定正则表达式,而无需将其分解为多个部分。检查您的软件的文档以了解它支持哪种正则表达式。

^(?!.*timetosa)

或者在vim

^(.*timetosa)\@!

大多数系统不需要正则表达式补充,因为您可以通过使用匹配反转标志(例如grep -v)或在第一个匹配设置中仔细排序规则来达到相同的效果(如果匹配.*timetosa.*,则不执行任何操作并停止匹配规则;如果匹配.*然后做某事)。

相关内容