为什么正则表达式中的 ^s$ 不匹配像“以 s 开头并以 s 结尾”这样的字符串?

为什么正则表达式中的 ^s$ 不匹配像“以 s 开头并以 s 结尾”这样的字符串?

如果^匹配行首并且$匹配行尾,那么为什么不^$匹配行首像标题中那样的字符串末尾?

如何制作这样一个匹配字符串的正则表达式:

“以 开始s,以 结束s。”

答案1

原因在于正则表达式匹配的处理方式(参见这里,例如):字符串从左到右计算,并且 - 除了反向引用 - 字符串中的每个符号都必须与正则表达式中的标记相匹配(在最简单的情况下是文字符号本身),尽管由于重复运算符,标记可以是隐式的。

关键点在于,正则表达式并不描述“整个字符串的一般属性”(例如“以s”开头和结尾),而是对字符串强加规则。角色级别字符串的。所以,你的正则表达式

^s$

意思是:“字符串开头”,后跟 s,并紧随其后的是“字符串结尾”。因此,这只会匹配由单个字母组成的字符串s。虽然从技术上讲,这是一个以 开头和结尾的字符串s,但它不是您要寻找的。

如果要匹配以 开头s、中间有任意字符并以 结尾的字符串s,则必须显式指定所有这些。

为了使其非常明确:

  • 第一次迭代可能如下所示:
    ^s.*s$
    
    这将匹配“以 开头的字符串s,后跟零个或多个任何类型的字符 ( .*),最后是s字符串末尾。
  • 当然,这会不是匹配由以下内容组成的字符串仅有的人物s。因此,在第二次迭代中,我们将在初始可选部分之后设置部分s(请参阅@user414777的评论):
    ^s(.*s)?$
    
    然后,这将匹配“以 开头的字符串s,后跟零次或一次 (the ?) '零个或多个任何类型的字符的子字符串,后跟s' ( 的内容(...)),并在其后立即结束”。

现在,当您用 标记您的问题时awk,这可能意味着您想要为awk规则创建一个条件,该条件仅适用于行或字符串以 开头和结尾的情况s。这可能看起来像:

awk '/^s/ && /s$/ { ... }'

grep, 这样一个- 构造本身是不可能的(语法相当于-e regex1 -e regex2或者),但你可以通过管道来实现:

grep "^s" sourcefile.txt | grep "s$"

相关内容