Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在什么情况下正则表达式才是解决问题的最佳方法?_Regex - Fatal编程技术网

Regex 在什么情况下正则表达式才是解决问题的最佳方法?

Regex 在什么情况下正则表达式才是解决问题的最佳方法?,regex,Regex,我不确定杰夫是否创造了它,但这是一个笑话,说“哦,我知道我会使用正则表达式!”的人现在有了。我一直认为这意味着人们在非常复杂的环境中使用正则表达式 然而,在什么情况下正则表达式才是最好的答案?它们到底是解决问题的最佳方法还是唯一方法?正则表达式是解析没有解析器(即XML)的文本的好方法我用它为.htaccess文件或我的URL重写器项目中的mod_rewrite语法创建了一个解析器,例如如果你想比“*”或“?”更具体一些,比如“3个字母,2个数字,一个$符号,然后一个句点”,它们真的很好 这段引

我不确定杰夫是否创造了它,但这是一个笑话,说“哦,我知道我会使用正则表达式!”的人现在有了。我一直认为这意味着人们在非常复杂的环境中使用正则表达式


然而,在什么情况下正则表达式才是最好的答案?它们到底是解决问题的最佳方法还是唯一方法?

正则表达式是解析没有解析器(即XML)的文本的好方法我用它为.htaccess文件或我的URL重写器项目中的mod_rewrite语法创建了一个解析器,例如

如果你想比“*”或“?”更具体一些,比如“3个字母,2个数字,一个$符号,然后一个句点”,它们真的很好

这段引语来自杰米·扎温斯基(Jamie Zawinski)的反Perl言论。我认为Perl以前做regex非常糟糕,但现在它似乎是很多程序的标准引擎

但同样的观点仍然适用。如果你不知道如何使用正则表达式,你最好不要尝试真正花哨的东西,否则你也会得到这些标签中的一个(见青铜列表);o)


它们适用于匹配或查找采用非常具体和简单格式的文本。例如,我所说的“简单”是指不嵌套且小于整个html规范。

Rexeprs适用于:

  • 文本格式验证(电子邮件、url、数字)
  • 文本搜索/替换
  • 映射(例如url模式到函数调用)
  • 过滤某些文本(与替换相关)
  • 解析过程中的词法分析

它们可用于验证任何具有以下模式的内容:

  • 社会保险号码
  • 电话号码(555-555-5555)
  • 电子邮件地址(something@example.com)
  • IP地址(但更复杂的是要确保它的有效性)
所有这些都有模式,并且很容易被正则表达式验证

它们很难用于具有逻辑而不是像信用卡号这样的模式的条目,但它们仍然可以用于进行一些客户端验证

那么最好的方法是什么呢

  • 清理客户端上的数据输入 在对其进行消毒之前 服务器
  • “搜索并替换”某些 包含模式的字符串

我确信我遗漏了很多其他案例。

它们主要对高度结构化的文本解析有价值。如果使用命名组(以及大多数成熟的正则表达式系统中的选项),则可以使用一种功能强大且简洁的方法来处理字符串

这里有一个例子。考虑到NETSTAT在不同Linux OSES中的各种迭代,而NETSTAT的版本可以返回不同的结果。有时会有一个额外的列,如果日期/时间格式为,有时会有一个移位。正则表达式为您提供了一种强大的方法,可以用一个表达式来处理这个问题。将其与命名组相结合,您就可以检索数据,而无需像:
1) 在空格上拆分
2) 好的,netstat版本是X,所以add我需要将1添加到超过第5列的所有数组引用中。
3) 好的,netstat版本是Y,所以我需要确保对日期信息使用多个数组引用


恶心。在正则表达式中修复很简单:-)

这不是社区wiki的另一种情况吗?它通常归因于Jamie Zawinsky。我对此投了赞成票,尽管包括电子邮件地址作为示例。。。电子邮件地址的验证非常复杂,而要用正则表达式来进行验证将是不可能破译的。