我正在学习正则表达式,在阅读this post之后,我开始做一些练习,我被困在exercise上。以下是应该匹配且不匹配的两个单词列表
我从
开始^(.).*\1$
并且被sporous
打扰但是不应该匹配。所以我找到了
^(.)(?!p).*\1$
这就是诀窍。
给定here的最佳解决方案(比我的解决方案少一个字符)是
^(.)[^p].*\1$
但我真的不明白这种模式。实际上我觉得我对在^
组中看到[]
锚点感到困惑,我对在其他地方看到^
锚点而不是在正则表达式的开头感到困惑。
你能帮助理解这个正则表达式在做什么吗?
答案 0 :(得分:2)
方括号中的任何内容都是一个字符类。此上下文使用自己的迷你语法,通过添加插入符号作为字符类{{1}中的第一个字符,仅列出允许的字符[abc]
或一系列允许的字符[a-z]
或不允许的字符}。
答案 1 :(得分:1)
[^p]
只是意味着任何字符都匹配,而不是p
。
我将在以下句子中逐步解释正则表达式。
^ start of the string
(.) matches any character as group 1
[^p] matches any character that is not p
.* matches any character that repeats zero or more times
\1 matches the exact matched character(s) from group 1
$ end of the string
学习正则表达式的一个很好的来源是regex101。
答案 2 :(得分:1)
您的解决方案使用不消耗字符的否定前瞻(?!p)
,只检查下一个字符是否不是p
。
另一个解决方案使用否定字符类[^p]
,它将使用p
以外的字符。
因此,最终解决方案取决于您需要匹配/捕获的内容。
答案 3 :(得分:1)
以下是^(.)[^p].*\1$
^ start of the string/line
(.) group first character
[^p] any character except p
.* zero or more characters
\1 first matched group again
$ end of the string/line
上述正则表达式匹配任何以相同字符开头和结尾的字符串,并且在第二个位置不包含p。
有关详细说明,请访问regex101。
答案 4 :(得分:1)
^
表示在行的开头断言位置,但是,在字符类[ ]
中,它等于匹配除...之外的字符
示例:强>
^test-[^p]-1234
<强>结果:强>
test-q-1234 // match
test-p-1234 // no match
test-o-1234 // match