/\ATo\:\s+(.*)/
此外,你是如何解决这个问题的?你采用了什么方法?
/\ATo\:\s+(.*)/
\A
匹配字符串的开头(\Z
是字符串的结尾,而 ^
/$
则匹配字符串或行的开头/结尾)。在单行变体中,您只需使用 ^
和 $
表示字符串/行的开头和结尾,因为没有区别。
To
是字面意思,\:
是一个转义字符 :
。
\s
表示空格,+
表示前面的 "字符"(这里是空格)出现一次或多次。
()
是一个捕获组,表示其中的所有内容都将存储在可以使用的 "寄存器" 中。因此,这就是要提取的关键内容。
.*
简单地表示任何非换行符字符 .
,零次或多次 *
。To: paxdiablo
Re: you are so cool!
paxdiablo
。
关于如何学习自己解决此问题,Perl正则表达式教程(Perl regex tutorial)(a)是一个很好的开始,然后就是不断实践:-)
(a)您并没有明确说明您使用的是哪个正则表达式实现,但大多数现代实现都非常类似于Perl。如果您能找到特定的教程以适应您的特定风格,那显然会更好。
\A
是一个零宽断言,意思是“仅在字符串开头匹配”。
这个正则表达式的意思是:以“To:”开头并跟随一个或多个空格(\s
),捕获该行剩余部分((.*)
)。
首先,您需要了解不同的字符类和量词。字符类是反斜杠前缀字符,例如正则表达式中的\A
。 量词例如+
。 互联网上有几个参考文献,例如this one。
使用它,我们可以从左到右看到发生了什么:
\A
匹配字符串的开头。To
精确匹配文本 "To"。\:
转义 ":",使其失去特殊含义,变成 "只是一个冒号"。\s
匹配空格(空格、制表符等)。+
表示匹配前面的类一次或多次,因此 \s+
表示一个或多个空格。()
是一个捕获组,括号内匹配的任何内容都将保存以供以后使用。.
表示 "任何字符"。*
类似于 +
,但是可以匹配零次或多次,因此 .*
表示任意数量的任何字符。综上所述,正则表达式将匹配以 "To:" 开头的字符串,然后至少有一个空格,接着是任何内容,它将保存这些内容。因此,对于字符串 "To: JaneKealum",您将能够提取 "JaneKealum"。
它匹配输入开头的To:
,后跟至少一个空格,然后是任意数量的字符作为一组。
你从左边开始查找任何转义字符(即\A
)。其余的都是普通字符。\A
表示输入的开头。因此,To:
必须在输入的最开始匹配。我认为:
没有必要转义。 \s
是所有空格(制表符、空格、可能是换行符)的字符组,后面跟着的+
表示必须有一个或多个空格字符。之后,您可以在组中捕获该行的所有剩余部分(用( )
标记)。
如果输入是
To: progo@home
捕获组将包含"progo@home"
\A
不同于 ^
。当使用 m
修改符时,它仅匹配一次。 - Linus Kleen初始和尾随的/
字符限定了正则表达式。
表达式中的\
表示特殊处理或将其视为字面值,如果它通常具有特殊含义。
\A
表示仅在字符串开头匹配。
To
表示匹配字面值"To"
\:
表示匹配字面值':'。冒号通常是一个字面值,没有特殊含义。
\s
表示匹配空格字符。
+
表示尽可能多地匹配其后跟随的任何内容,但至少匹配一个,因此\s+
表示匹配一个或多个空格字符。
(
和)
定义了一组字符,这些字符将被表达式求值器捕获并返回。
最后,.
匹配任何字符,*
表示尽可能多地匹配,但可以为零。因此,(.*)
将捕获输入字符串末尾的所有字符。
因此,该模式将匹配以"To:"开头的字符串,并捕获在第一个非空格字符之后出现的所有字符。
唯一真正理解这些东西的方法是逐位检查并检查每个组件的含义。