你用什么正则表达式?

时间:2009-01-01 02:39:17

标签: regex language-agnostic

我听说过正则表达式,只看过一些用例,所以我不想经常使用它们。在过去,我做了几件事,花了我几个小时的时间。后来我跟别人说话,他们说“这是用正则表达式做的。”

那么您使用正则表达式的内容是什么?如果我得到更多的例子,那么我可以开始知道何时寻找并使用它们。

23 个答案:

答案 0 :(得分:13)

很多事情。包括:

  • 检查命令行
  • 解析用户输入
  • 解析各种文本文件
  • 检查网络服务器日志
  • 检查测试结果
  • 在电子邮件中查找文字
  • 阅读配置文件

学习正则表达式时,学习克制可能会有所帮助。像我一样,你可能会试图将正则表达式看作是太多问题的解决方案。

答案 1 :(得分:11)

我使用正则表达式的最后一件事是验证文本输入以确保输入字符串符合某些规则,例如第二个字符必须是' - '。

我读了你的问题并立刻想到了这一点。

alt text

编辑:忘了提这个XKCD漫画。 http://xkcd.com/208/

答案 2 :(得分:6)

最常见的用例是查找与模式匹配的字符串。通常,搜索与替换与模式匹配的文本与另一个字符串相结合。

例如,以下表达式将匹配行开头的空格(在此特定情况下只是空格和制表符)。

^[ \t]+

如果您想要删除该空格,这可能很有用。

答案 3 :(得分:4)

我将使用正则表达式的关键是:

  1. 输入验证
  2. 清理输入
  3. 输入重组
  4. 在输入中查找子字符串

答案 4 :(得分:4)

输入验证例程充当Web应用程序的第一道防线。正则表达式是验证输入的一种强大而强大的方法。

如果您对输入的类型,长度,格式或范围做出毫无根据的假设,那么您的应用程序就不太可能是健壮的。如果攻击者发现您做出了毫无根据的假设,则输入验证可能会成为安全问题。然后,攻击者可以通过尝试SQL注入,跨站点脚本和其他注入攻击来提供精心设计的输入,从而危及您的应用程序。为避免此类漏洞,您应验证文本字段(例如姓名,地址,税号等)并使用正则表达式。

例如,不是仅为姓氏输入添加必填字段,而是使用以下表达式仅允许大写和小写字符以及一些名称常用的特殊字符。

^ [a-zA-Z'' - '\ s] {1,40} $

答案 5 :(得分:3)

对于自学者,您可以了解有关正则表达式的所有内容以及更多内容:http://www.regular-expressions.info/

理解它们被称为“正则表达式”的原因可能会有所帮助。它的“常规”部分意味着对模式有一些期望。它的“表达式”部分意味着它们在某种意义上是文本的数学表示,这反过来又允许您从文本中提取信息。

例如,我编写了一个模块,该模块使用正则表达式将电话号码拆分为其组成部分 - 例如国家,地区代码,交换所和电台。这对于人类来说听起来很容易,但对于计算机而言,如果您认为有很多方法可以写出电话号码,那就不那么容易了。您可以执行+1(407)555-1234或407-555-1234或555-1234(7位拨号)或1.407.555.1234或4075551234.使用正则表达式有助于在有某些事情时抽象处理文本您试图从文本中提取。

答案 6 :(得分:2)

我经常使用它们,可能是因为我主要是在Linux环境中并且可以轻松访问它们。

  • 在编辑器中搜索内容,特别是当我知道一行中的两个部分而不是中间的内容时(请原谅无关的空白)
    • 带小部件的reval函数在哪里? “reval.*\<widget\<
    • my_obj分配给哪里? “\<my_obj\>.*=
  • 搜索和替换以生成数据文件的修改:即,将所有交付卷设置为一个“#<volume>[-0-9.]+</volume>#<volume>1.0</volume> #g”
  • 将输出设置为适合屏幕(删除空格或不感兴趣的字段)。
  • 将数据文件转换为其他格式,例如获取日志文件并为gnuplot生成一个图形性能数据的文件。
  • 用于程序化用途,例如模式匹配数据值的名称,以便在符合使用正则表达式最容易表达的某些条件时以不同方式处理它。

使用正则表达式后,我讨厌Windows“查找”框,因为它非常有限。

正如另一位用户回答的那样,正则表达式本质上是更强大的通用表达式,但它们远远超出了它。您无需阅读"Master Regular Expressions"即可使用它们,但我确实推荐了这本书。我确信互联网上有足够的资源,例如here,虽然我不能担保任何资源。

使用正则表达式(无论是在代码中还是在命令行上)的另一个优点是它们已经过大量优化。 Grep和DFA parsers几乎肯定比你自己写的更快......并且第一次更可能是正确的。当你有这么好的方便时,不要重新发明轮子。

答案 7 :(得分:2)

好吧,任何时候只要匹配一个逐字词就需要匹配某些东西是行不通的。重命名文件,在代码中搜索和替换,您可以为其命名。

传统示例可能是您想要查找文件中所有出现的电话号码。搜索单个数字显然不会起作用,只搜索破折号可能会模糊不清。更好的说法是“找到所有出现的3位数后跟一个短划线后跟4位数字”(为了示例目的保持基本;实际上你可能想要匹配区号,不同的分隔符等)。

关于正则表达式的另一个好处是它们允许您使用部分/全部搜索的内容替换。因此,如果您想用其他东西替换所有区号555,您可以保持电话号码的其余部分完好无损。

答案 8 :(得分:2)

多年前,在iPhone之前,Windows Mobile和Palm PDA上的网络浏览器确实非常有限。除非你拥有最新版本的Windows Mobile,否则即使CSS也不受限制。因为我有一个带有花哨的无线附加卡的令人讨厌的PDA,我想从它上网而不是购买笔记本电脑,所以我建立了一个门户网站。我做的一件事是一个可以对HTML的某些部分进行转换,删除和替换的页面,可以是删除所有图像的常规操作,也可以是特定于站点的内容。这几乎都是用正则表达式完成的。

答案 9 :(得分:1)

Stack Overflow实际上是查找用例的好地方:

https://stackoverflow.com/questions/tagged/regex

将正则表达式视为类固醇上的glob(你知道,*?{a,b,c} [abc])。

答案 10 :(得分:1)

在我的网络表单中,我经常使用正则表达式来验证用户输入文本字段或类似内容的内容。电子邮件地址需要是一些非空格字符,后跟“@”字符,后跟一些非空白字符,后跟一个句点字符等。日期需要满足一些允许的格式之一(1/23) / 2008,1/23/08)为了让我的代码准确找出输入的日期。等

答案 11 :(得分:1)

我基本上将它们用于任何我需要的东西而不是精确的字符串匹配,但我并不关心性能或可维护性来做任何需要多行代码的事情。

答案 12 :(得分:1)

拔出一串输入。例如,

  • 通过直接匹配HTML或(更有用)来自w3m之类的工具的ASCII输出来“屏幕抓取”网页,例如,用于查找足球比赛何时结束,以便我的计算机可以停止录制

  • 将电子邮件标题拆分为标记和值,例如,以帮助识别垃圾邮件

  • 从学生记录中提取姓名,姓氏和电子邮件地址,以便在成绩簿中我可以通过姓氏识别学生是否唯一,如果需要消除歧义,则可以“最后,第一”

正则表达式是第一个广泛部署的字符串处理工具,但是现在我常常喜欢基于解析表达式语法的东西,比如LPEG pattern matcher

答案 13 :(得分:0)

解析骰子符号(“2d6”,“3d4 + 10”等)以在ruby中创建Dice对象。 (不确定这段代码是否是“完美”的方式,因为我还在学习Ruby)。

def Dice
    def self.parse(str)
        match = /^(\d+)d(\d+)([\+|\-]\d+)?$/.match(str)
        amt, sides, mod = match.captures.map {|c| c.to_i }
        Dice.new(amt, sides, mod)
    end
end

非常好,容易。

答案 14 :(得分:0)

在ASP.NET中,如果您使用用户控件或母版页,即使您唯一地命名控件,它们也会被框架破坏。我在原型$函数周围编写了一个小包装器,允许我在javascript中获得受损的控件,尽管名称已经过了。它使用正则表达式在DOM中搜索以适当名称结尾的控件。

我还在需要匹配特定输入模式的输入的客户端/服务器端验证中大量使用它。

答案 15 :(得分:0)

验证电子邮件地址是我一直使用正则表达式的方法。

我甚至不想考虑尝试以另一种方式做某事。

答案 16 :(得分:0)

简而言之,只要您需要理解或操纵字符串,正则表达式就很有用。当您要编写多行文本处理代码块并且您意识到正则表达式可以在一行中执行时,特别容易找到正则表达式。

答案 17 :(得分:0)

正则表达式适用于小型和中型文本中的小文本搜索,模式匹配和子站。例如,我使用RE的地方之一是表单字段验证。

如果你不介意表现,那么你可以通过文本做任何快速而肮脏的脚本。

答案 18 :(得分:0)

I've regularly used it to take text output from some programs which have a lot of information and abstract some of that information to be saved in databases, spreadsheets or even as a new text file.
Also, I've used it in a program to read text files that initialize the program's variables.

答案 19 :(得分:0)

我还使用它们来构建符合现有验证规则的随机数据。

答案 20 :(得分:0)

  1. 拖动异常或验证行的日志文件(即“子系统A启动...”)等
  2. 替换文本(即在源文件中,快速成为Sysout语句)
  3. 向同事解释正则表达式有多强大。

答案 21 :(得分:0)

我将它们用于check for prime numbers,但我想知道为什么有时它很慢: - )

/^1?$|^(11+?)\1+$/

答案 22 :(得分:0)

我用它在OCR之后解析数据。正则表达式对于丢弃错误并保留我们正在寻找的真实数据非常有用。