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是由\(和\)之间的子模式匹配的字符串部分