这个正则表达式是什么意思?

4
/\ATo\:\s+(.*)/

此外,你是如何解决这个问题的?你采用了什么方法?

这是一个学习正则表达式的好资源:http://www.regular-expressions.info/ - Felix Kling
6个回答

4
在多行正则表达式中,\A 匹配字符串的开头(\Z 是字符串的结尾,而 ^/$ 则匹配字符串或行的开头/结尾)。在单行变体中,您只需使用 ^$ 表示字符串/行的开头和结尾,因为没有区别。 To 是字面意思,\: 是一个转义字符 :\s 表示空格,+ 表示前面的 "字符"(这里是空格)出现一次或多次。 () 是一个捕获组,表示其中的所有内容都将存储在可以使用的 "寄存器" 中。因此,这就是要提取的关键内容。 .* 简单地表示任何非换行符字符 .,零次或多次 *
因此,这个正则表达式将处理像以下的字符串:
To: paxdiablo
Re: you are so cool!

并返回文本paxdiablo

关于如何学习自己解决此问题,Perl正则表达式教程(Perl regex tutorial)(a)是一个很好的开始,然后就是不断实践:-)


(a)您并没有明确说明您使用的是哪个正则表达式实现,但大多数现代实现都非常类似于Perl。如果您能找到特定的教程以适应您的特定风格,那显然会更好。


2

\A 是一个零宽断言,意思是“仅在字符串开头匹配”。

这个正则表达式的意思是:以“To:”开头并跟随一个或多个空格(\s),捕获该行剩余部分((.*))。


1

首先,您需要了解不同的字符类和量词。字符类是反斜杠前缀字符,例如正则表达式中的\A。 量词例如+。 互联网上有几个参考文献,例如this one

使用它,我们可以从左到右看到发生了什么:

  • \A 匹配字符串的开头。
  • To 精确匹配文本 "To"。
  • \: 转义 ":",使其失去特殊含义,变成 "只是一个冒号"。
  • \s 匹配空格(空格、制表符等)。
  • + 表示匹配前面的类一次或多次,因此 \s+ 表示一个或多个空格。
  • () 是一个捕获组,括号内匹配的任何内容都将保存以供以后使用。
  • . 表示 "任何字符"。
  • * 类似于 +,但是可以匹配零次或多次,因此 .* 表示任意数量的任何字符。

综上所述,正则表达式将匹配以 "To:" 开头的字符串,然后至少有一个空格,接着是任何内容,它将保存这些内容。因此,对于字符串 "To: JaneKealum",您将能够提取 "JaneKealum"。


1
“+”不是修饰符,而是量词。修饰符是您在表达式后面放置的标志,例如“i”,“g”等。 - Felix Kling
没错,混淆了术语。我会修正它。 - carlpett

0

它匹配输入开头的To:,后跟至少一个空格,然后是任意数量的字符作为一组。


0

你从左边开始查找任何转义字符(即\A)。其余的都是普通字符。\A表示输入的开头。因此,To:必须在输入的最开始匹配。我认为:没有必要转义。 \s是所有空格(制表符、空格、可能是换行符)的字符组,后面跟着的+表示必须有一个或多个空格字符。之后,您可以在组中捕获该行的所有剩余部分(用( )标记)。

如果输入是

To:   progo@home

捕获组将包含"progo@home"


1
\A 不同于 ^。当使用 m 修改符时,它仅匹配一次。 - Linus Kleen

0

初始和尾随的/字符限定了正则表达式。

表达式中的\表示特殊处理或将其视为字面值,如果它通常具有特殊含义。

\A表示仅在字符串开头匹配。

To表示匹配字面值"To"

\:表示匹配字面值':'。冒号通常是一个字面值,没有特殊含义。

\s表示匹配空格字符。

+表示尽可能多地匹配其后跟随的任何内容,但至少匹配一个,因此\s+表示匹配一个或多个空格字符。

()定义了一组字符,这些字符将被表达式求值器捕获并返回。

最后,.匹配任何字符,*表示尽可能多地匹配,但可以为零。因此,(.*)将捕获输入字符串末尾的所有字符。

因此,该模式将匹配以"To:"开头的字符串,并捕获在第一个非空格字符之后出现的所有字符。

唯一真正理解这些东西的方法是逐位检查并检查每个组件的含义。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接