代码之家  ›  专栏  ›  技术社区  ›  waldo

我没有正则表达式

  •  9
  • waldo  · 技术社区  · 7 年前

    一些人可以用简单的术语解释它们,并提供一些基本的例子,说明它们可能有用,甚至是关键的。

    12 回复  |  直到 16 年前
        1
  •  32
  •   Jon Skeet    17 年前

    模式 . 例如,假设您需要识别以下模式:

    • 任意字母A-Z,大写或小写,5或6次
    • 3位数
    • 一个字母a-z(绝对小写)

    (邮政编码、信用卡、社会保险号码验证等都会出现这种情况。)

    那不是真的 坚固的 用代码编写——但随着模式变得越来越复杂,它会变得越来越难。使用正则表达式,您可以描述 图案 (而不是验证它的代码)并让正则表达式引擎为您完成工作。

    这里的模式是这样的

    [A-Za-z]{5,6}[0-9]{3}[a-z]
    

    但也有一些缺点:

    • 不同的正则表达式引擎之间的行为存在差异
    • 如果你不是专家(我当然不是!),复杂性可能很难判断;有一些“陷阱”可以使模式在特定输入下变得非常缓慢,而这些陷阱一点也不明显
    • 认真地 建议匹配正则表达式。疯狂。(他们也把正则表达式搞错了,这在某种程度上证明了这一点。)
    • 正则表达式使用反斜杠来转义各种事物(例如,使用.来表示“一个点”,而不仅仅是“任何字符”。在许多语言中,反斜杠本身需要转义。
        2
  •  23
  •   Brian R. Bondy    17 年前

    正则表达式的用途是:

    • 表单验证,确定用户输入的格式是否符合您的要求
    • 在文本块中查找某个图案的位置
    • 搜索和替换,其中搜索词是正则表达式,替换的是普通字符串。

    一些正则表达式语言功能:

    • 交替: 允许您选择一件事或另一件事。示例仅匹配“是”或“否”。

      是|不是

    • gr(a | e)y |黑|白

    • 量化: 你可以量化你想要多少东西?表示1或0,*表示0或更多表示至少一个。示例:接受非空的二进制字符串:

      (0|1)+

    为什么是正则表达式?

    不适用于所有类型的匹配:

    要理解某件东西是如何有用的,你也应该理解它是如何无用的。正则表达式对于某些任务是不好的,例如,当您需要保证字符串的括号数相等时。

    提供几乎所有语言版本:

    正则表达式几乎可以在任何编程语言中使用。

    正式语文:

    例子:

    [hc]+at 
    

    Source, further reading

        3
  •  4
  •   Henk Holterman    16 年前

    它们看起来有点神秘,但它们提供了一个非常强大的工具来寻找 文本模式 . 任何来自 href

    它们可以被处理成一个非常高效的数据结构(FSA),可以非常快速地找到匹配项。

        4
  •  3
  •   Joonas Pulakka    17 年前

    它们有点棘手,但非常强大,值得学习。网络上充满了教程和示例,例如从 here 看看这些例子 here .

        5
  •  3
  •   annakata    9 年前

    如果我可以将OP引导到我自己的一个问题的一些答案/评论: How important is knowing Regexs?

        6
  •  1
  •   Michael Borgwardt    17 年前

    正则表达式是指定大多数模式匹配和替换问题的一种非常简洁的方法,并且regexp引擎可以得到高度优化。

    如果您想做与相对简单的regexp相同的工作,那么就必须编写大量代码,这些代码可能会包含许多bug,难以理解,并且性能很差。

    而使用regexp执行相同操作的时间要短得多,几乎可以肯定,它的性能与技术上可能的一样好,并且对于熟悉regexp的任何人来说都更容易理解(尽管在任何情况下都应该对其进行注释)

        7
  •  1
  •   Anthony Roy    17 年前

    电子邮件示例实际上是正则表达式的一个糟糕示例。可以使用正则表达式,但结果表达式(例如 this one 它不处理“约翰·多伊”式的地址)是非常复杂的——看看 email address specification 你会明白为什么。。。

    然而,正则表达式在许多其他情况下非常有用,例如从文本中提取ip地址、从html中提取标记等。查找所有版本化文件将是另一个例子。大致如下:

    my_versioned_file_(\d{4}-\d{2}-\d{2}).txt
    

    将匹配该格式的任何文件名 my_versioned_file_2009-02-26.txt

    没有正则表达式是不必要的,但是它们可以节省大量的时间,为正则表达式可以轻松实现的事情编写一个手动解析器。

        8
  •  0
  •   Rob Stevenson-Leggett    17 年前

    当您在大量文本数据中找到某种模式时,或者如果您想检查字符串是否为某种格式时。

    例如电子邮件地址。。。

    检查at符号和有效域的代码看起来相当大,您可以使用正则表达式,并在两行代码中找到答案。

    Regex r = new Regex("<An Email Address Regex>");
    bool isValidEmail = r.IsMatch(MyInput);
    

    其他示例是在将数字解析为整数之前检查其格式是否正确。

        9
  •  0
  •   erik404    17 年前

    Jon和Sqook对正则表达式给出了很好的解释和定义,对于简单的问题,这是很容易理解的,但是如果你把它用于复杂的问题,正则表达式可以是a&$ @ ((至少对我来说;-))

    我经常使用Expresso来帮助我构建复杂的正则表达式代码。

    http://www.ultrapico.com/Expresso.htm

    祝你好运!

        10
  •  0
  •   Trampas Kirk    17 年前

    一些实际应用:

    查找扩展JUnit测试用例的抽象类:

    abstract\s+class\s+\w+\s+extends\s+TestCase
    

    这对于查找无法实例化且需要从运行测试用例的ant构建脚本中排除的测试用例非常有用。您无法搜索常规文本,因为您事先不知道类名。因此使用了\w+(至少一个单词字符)。

    查找正在运行的bash或bourne shell脚本:

     ps -e | grep -e " sh| bash"
    

    如果您想全部杀死它们或其他什么东西,那么这非常有用,如果您只搜索sh,您将无法获得bash脚本,并且必须再次运行bash脚本的命令。同样,它比完美更有用,但几乎没有一个即时编写的正则表达式是可用的。

        11
  •  0
  •   awe    16 年前

    关键用途的例子是 JavaScript :
    如果你需要的话 search replace

    就我个人而言,只有在文本编辑器中的自动查找/替换中需要一些高级匹配时,我才会使用正则表达式( TextPad 或Visual Studio)。在我看来,最强大的功能是能够匹配可以插入到替换中的模式。

        12
  •  0
  •   Steve Lane    16 年前

    举几个例子:

    • 电子邮件地址

    • 密码至少需要1个字母和1个数字

    • 你怎样才能达到这些要求?

    • 最好的方法是使用正则表达式。

    阅读以下链接了解更多信息:

    如何:在ASP.NET中使用正则表达式约束输入 http://msdn.microsoft.com/en-us/library/ms998267.aspx