Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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,我不太懂正则表达式。你能用简单易懂的方式给我解释一下吗?如果有任何在线工具或书籍,您也可以链接到它们吗?最重要的部分是概念。一旦您了解了构建块的工作原理,语法上的差异只不过是温和的方言。正则表达式引擎语法之上的一层是您正在使用的编程语言的语法。Perl之类的语言消除了大部分这种复杂性,但如果在C程序中使用正则表达式,则必须记住其他注意事项 如果您认为正则表达式是可以随意混合和匹配的构建块,那么它可以帮助您学习如何编写和调试自己的模式,以及如何理解他人编写的模式 从简单开始 从概念上讲,最简单的正

我不太懂正则表达式。你能用简单易懂的方式给我解释一下吗?如果有任何在线工具或书籍,您也可以链接到它们吗?

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

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

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

相邻的正则表达式匹配序列。例如,模式
Nick
匹配序列“N”,后跟“i”,后跟“c”,后跟“k”

如果您曾经在Unix上使用过
grep
,即使只是搜索外观普通的字符串,您已经在使用正则表达式了!(
grep
中的
re
表示正则表达式。)

从菜单上点菜 只需增加一点复杂性,就可以将“Nick”或“Nick”与模式匹配
[Nn]ick
。方括号中的部分是字符类,这意味着它正好匹配一个封闭字符。您还可以在字符类中使用范围,因此
[a-c]
匹配“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
匹配所有这些块

  • 艾克
  • 尼克
  • 尼克
  • 安尼克
  • 安尼克
  • 安尼克
  • (等等)
第一场比赛展示了一个重要的教训:
*
总是成功!任何模式都可以匹配零次

其他几个有用的例子:

  • [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)

例如,您可以将
[a-c]
等效为
a | b | c
,但这可能是次优的,因为许多实现假设备选方案的长度大于1

逃逸 虽然有些字符与自己匹配,但有些字符有特殊的含义。模式
\d+
与反斜杠后跟小写字母d和加号不匹配:要得到它,我们使用
\\d\+
。反斜杠删除以下字符的特殊含义

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

例如,假设输入是

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

您可能希望
“+”
只匹配“Hello”,然后当您看到它从“Hello”一直匹配到“You?”,您会感到惊讶

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

如果您的输入是“(123)