我不太了解正则表达式。 您能以一种易于理解的方式向我解释它们吗? 如果有任何在线工具或书籍,您还可以链接到它们吗?

===============>>#1 票数:765

最重要的部分是概念。 一旦您了解了构建块的工作原理,语法上的差异就等于温和的方言。 正则表达式引擎语法之上的一层是您正在使用的编程语言的语法。 诸如Perl之类的语言消除了大多数这种复杂性,但是如果您在C程序中使用正则表达式,则必须牢记其他注意事项。

如果您将正则表达式视为可以随意混合和匹配的构建基块,那么它可以帮助您学习如何编写和调试自己的模式,以及如何理解他人编写的模式。

从简单开始

从概念上讲,最简单的正则表达式是文字字符。 模式N与字符“ N”匹配。

正则表达式彼此相邻,匹配序列。 例如,模式Nick匹配序列“ N”,“ i”,“ c”和“ k”。

如果您曾经在Unix上使用过grep (即使只是用于搜索普通的字符串),那么您已经在使用正则表达式! grepre是指正则表达式。)

从菜单订购

稍微增加一点复杂性,就可以将[Nick]或'nick'与模式[Nn]ick匹配。 方括号中的部分是一个字符类 ,这意味着它与所包含的字符之一完全匹配。 您也可以在字符类中使用范围,因此[ac]匹配“ a”或“ b”或“ c”。

模式. 是特殊的:它不仅匹配文字点,还匹配任何字符 从概念上讲,它与真正的大字符类[-.?+%$A-Za-z0-9...]

将角色类视为菜单:仅选择一个。

有用的快捷方式

使用. 可以为您节省很多输入时间,还有其他常用模式的快捷方式。 假设您要匹配一个数字: [0-9]是一种书写方式。 数字是经常匹配的目标,因此您可以改用快捷方式\\d 其他的是\\s (空格)和\\w (单词字符:字母数字或下划线)。

大写字母的变体是它们的补语,因此\\S匹配任何空白字符。

一次还不够

从那里,您可以使用量词重复模式的某些部分。 例如,模式ab?c与'abc'或'ac'相匹配,因为? 量词使它修改的子图案成为可选的。 其他量词是

  • * (零次或多次)
  • + (一次或多次)
  • {n} (恰好n次)
  • {n,} (至少n次)
  • {n,m} (至少n次但不超过m次)

将其中一些块放在一起,模式[Nn]*ick匹配所有

  • ick
  • 缺口
  • 缺口
  • 尼克
  • 尼克
  • 尼克
  • (等等)

第一场比赛展示了一个重要的教训: *总是成功! 任何模式都可以匹配零次。

其他一些有用的例子:

  • [0-9]+ (及其等价\\d+ )与任何非负整数匹配
  • \\d{4}-\\d{2}-\\d{2}匹配日期格式为2019-01-01的日期

分组

量词将模式修改到其紧邻的左侧。 你可能期望0abc+0可以匹配“0abc0”,“0abcabc0”,等等,但是模式立即向左侧的加量词是c 这意味着0abc+0与'0abc0','0abcc0','0abccc0'等匹配。

要匹配一个或多个'abc'序列,并且两端都为零,请使用0(abc)+0 括号表示可以量化为一个单位的子模式。 正则表达式引擎通常会保存或“捕获”与括号组匹配的输入文本部分。 与对索引和substr计数相比,以这种方式提取位更加灵活且不易出错。

轮换

之前,我们看到了一种匹配“尼克”或“尼克”的方法。 另一个如Nick|nick 请记住,交替包括其左侧的所有内容和右侧的所有内容。 使用分组括号来限制|的范围。 例如 (Nick|nick)

再举一个例子,您可以将[ac]等价地写为a|b|c ,但这可能不是最优的,因为许多实现都假定替代项的长度大于1。

转义

尽管某些字符匹配,但其他字符具有特殊含义。 模式\\d+与反斜杠,小写字母D和加号不匹配:要实现此目的,我们将使用\\\\d\\+ 反斜杠从后面的字符中删除特殊含义。

贪婪

正则表达式量词是贪婪的。 这意味着它们可以匹配尽可能多的文本,同时允许整个模式成功匹配。

例如,假设输入为

“你好,”她说,“你好吗?”

您可能希望".+"仅匹配“ Hello”,然后在看到它与“ Hello”一直到“ you?”匹配时会感到惊讶。

要从贪婪切换到您可能认为谨慎的地方,请添加一个额外的? 到量词。 现在您了解了问题中的示例\\((.+?)\\)的工作原理。 它与文字左括号的顺序匹配,后接一个或多个字符,并以右括号终止。

如果您输入的是'(123)(456)',则第一个捕获将是'123'。 非贪婪的量词希望允许模式的其余部分尽快开始匹配。

(关于您的困惑,我不知道任何((.+?))会做同样事情的正则方言。我怀疑在传输过程中某些地方丢失了某些东西。)

锚点

使用特殊模式^仅在输入的开头进行匹配,而$仅在输入的末尾进行匹配。 用您的模式制作“书挡”,您说:“我知道正面和背面是什么,但是请给我之间的一切”是一种有用的技术。

假设您要匹配表单的注释

-- This is a comment --

你会写^--\\s+(.+)\\s+--$

建立你自己的

正则表达式是递归的,因此,既然您了解了这些基本规则,就可以随意组合它们。

编写和调试正则表达式的工具:

图书

免费资源

脚注

†:上方的陈述. 匹配任何字符都是出于教学目的的简化,并非严格如此。 点匹配除换行符"\\n"之外的任何字符,但实际上,您很少期望.+这样的模式跨越换行符边界。 Perl正则表达式具有/s开关和Java Pattern.DOTALL ,例如make . 完全匹配任何字符。 对于没有这种功能的语言,可以使用[\\s\\S]来匹配“任何空格或任何非空格”,换句话说,就是任何东西。

  ask by community wiki translate from so

未解决问题?本站智能推荐: