如果^
匹配行首并且$
匹配行尾,那么为什么不^$
匹配行首和像标题中那样的字符串末尾?
如何制作这样一个匹配字符串的正则表达式:
“以 开始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$"