Regex 为什么我的正则表达式不匹配C和下一个字母?

Regex 为什么我的正则表达式不匹配C和下一个字母?,regex,unix,Regex,Unix,我的测试文件是: PolicyChain:ComplementaryUser Caught PolicyChain:SourceIP Caught 我的正则表达式是: cat testfile | grep -E -o '[^PolicyChain:].+?' 它匹配: mplementaryUser Caught SourceIP Caught 我最终只是尝试匹配冒号后面但空格之前的字符串。请帮助???[^PolicyChain:][/code>是一个字符类,它与p,o,l,i,c,y,

我的测试文件是:

PolicyChain:ComplementaryUser Caught
PolicyChain:SourceIP Caught
我的正则表达式是:

cat testfile | grep -E -o '[^PolicyChain:].+?'
它匹配:

mplementaryUser Caught
SourceIP Caught

我最终只是尝试匹配冒号后面但空格之前的字符串。请帮助???

[^PolicyChain:][/code>是一个字符类,它与
p
o
l
i
c
y
c
h
a
i

然后匹配一个或多个字符,惰性地
+?

由于正则表达式必须通过匹配非c(第一个令牌)开始,因此它不能在
ComplementaryUser
c
处开始匹配


我建议您使用字符类的决定是一个错误,您需要一个积极的查找,例如
(?
[^PolicyChain:][/code>是一个字符类,它匹配一个不匹配的字符(如
^
所示)在
P
o
l
i
c
y
c
h
a
i
n

然后匹配一个或多个字符,惰性地
+?

由于正则表达式必须通过匹配非c(第一个令牌)开始,因此它不能在
ComplementaryUser
c
处开始匹配

我建议您决定使用character类是一个错误,您需要一个积极的查找,比如
(?试试这个

cat testfile | sed -e "s/.*:\([^ ][^ ]*\).*/\1/"
试试这个

cat testfile | sed -e "s/.*:\([^ ][^ ]*\).*/\1/"

您可以简单地使用剪切:

echo "PolicyChain:ComplementaryUser Caught" | cut -d: -f 2

您可以简单地使用剪切:

echo "PolicyChain:ComplementaryUser Caught" | cut -d: -f 2

计划在SQL中使用此功能…但现在只在cli上测试。不要认为SQL有拆分功能计划在SQL中使用此功能…现在只在cli上测试。不要认为SQL有拆分功能谢谢你的回答。我尝试了cat testfile | grep-E-o'?我相信你的意思是
(?@Asad谢谢,修复了。user1899415,阅读lookaheads和lookbehinds的语法是如何工作的-您必须键入正确的语法,否则它会失败。(并且您必须使用perl风格的正则表达式引擎。)@user1899415您需要在它后面加上
+?
(?@user1899415是的,使用
\S*
而不是
*
\S
\S
的倒数,它匹配所有的空白,所以
\S
匹配所有的非空白。(我用它作为我所有regex需求的参考)谢谢你的回答。我试过cat testfile | grep-E-o'?我相信你的意思是
(?@Asad谢谢,修复了。user1899415,阅读lookaheads和lookbehinds的语法是如何工作的-您必须键入正确的语法,否则它会失败。(并且您必须使用perl风格的正则表达式引擎。)@user1899415您需要在它后面加上
+?
(?@user1899415是的,使用
\S*
而不是
*
\S
\S
的倒数,它匹配所有的空白,所以
\S
匹配所有的非空白。(我使用我所有的正则表达式需求作为参考)结尾的\1做什么?\1是由\(和\)之间的子模式匹配的字符串部分)结尾的\1做什么?\1是由\(和\)之间的子模式匹配的字符串部分