【发布时间】:2013-02-09 02:53:09
【问题描述】:
我想使用“或”、“与”和“非”等运算符在具有“Google”风格的字符串中进行搜索。可以在正则表达式中模拟这个运算符吗?
例如,我想使用单词“Javascript”、“PHP”和“Perl”在给定的字符串中进行以下搜索。
- Javascript 和 PHP
- Javascript 而不是 PHP
- Javascript 和 PHP 和 Perl
- Javascript 和(PHP 或 Perl)
PS:我不介意区分大小写的问题,因为所有重要的语言都有一个选项。
在 cmets 之后编辑:很明显,可以使用多个模式匹配扫描运行任何布尔表达式,但是,在单个正则表达式中考虑解决方案是很有趣的。此外,“期待”功能允许 解决非常复杂的模式匹配问题。
【问题讨论】:
-
您的意思是“是否可以在 single 正则表达式中执行此操作”。因为多次执行它当然是微不足道的,例如
/Javascript/ and !/PHP/,或/Javascript/ and (/PHP/ or /Perl/)等 -
用很多正则表达式都是微不足道的,@TLP。然而,在单个正则表达式中执行它更灵活、高效和优雅,它只是一次解析。只需在数据库中的数百万条记录中提交此搜索即可。
-
实际上,对您的示例字符串进行基准测试时,我发现两个单个正则表达式比您的组合快 75%。它可能更优雅,但不是更易读,也不是(必然)更有效。看到它here
-
我经常看到有人提出关于 Stack Overflow 的问题,他们一心想通过在一个单一的、难以理解的表达式中编写复杂的条件来使 Perl 正则表达式引擎跳过障碍。它似乎与将 Perl 程序压缩为类似不透明的单行程序的决心相同。帮自己一个忙:以最清晰、最易于维护的方式编写代码,您可能会发现它也是最高效的。如果您发现性能不可接受,则进行一些分析以找出代码的哪一部分需要加速。花哨的代码是糟糕的代码。
-
@TLP,反对事实没有论据!然而,有时发现正则表达式的巨大威力是很有趣的。我喜欢在一个简单的例子中与社区分享这个
标签: php javascript regex perl