在一行perl中查看正则表达式的后面
我正在尝试制作一个单行脚本,当在一行perl中查看正则表达式的后面,perl,regex-negation,regex-lookarounds,Perl,Regex Negation,Regex Lookarounds,我正在尝试制作一个单行脚本,当github在golang后面时打印 例如,java是github中使用的一种语言应该匹配,而golang是github中使用的一种语言不应该匹配 我尝试过表达式/(?),但它不起作用 echo "golang is a language used in github" | perl -nle'print /(?<!golang).*github/ ? "match" : "no match"' echo“golang是github中使用的语言”|
github
在golang
后面时打印
例如,java是github中使用的一种语言
应该匹配,而golang是github中使用的一种语言
不应该匹配
我尝试过表达式/(?),但它不起作用
echo "golang is a language used in github" |
perl -nle'print /(?<!golang).*github/ ? "match" : "no match"'
echo“golang是github中使用的语言”|
perl-nle'print/(?您的表达式将所有字符串与其中的单词“github
”匹配。让我们看看原因:
/(?<!golang).*github/
正则表达式可以通过将字符串指定给不同的部分进行匹配:
(?在字符串开头匹配
*
获取“golang是一种在
中使用的语言”
github
获取“github
”
要实现您的目标,一种可能成本高昂的方法是:
/^(?:(?!golang).)*github/
它的工作原理是确保“github
”前面的任何字符都不会开始序列“golang
”
所以
将打印出而不是golang:true
而
echo "golang is a language used in github" | perl -ne 'print q!Not golang: !, /^(?:(?!golang).)*github/ ? q!true! : q!false!'
将打印出而不是golang:false
另一种(较少混淆的)方法是进行两次连续测试:
/^(.*)github/ and $1 !~ /golang/
如果你要做几十行或几十万行,也许可以测试两种方法,找出哪一种更快?你的表达式将所有字符串与其中的“github
”匹配。让我们看看原因:
/(?<!golang).*github/
正则表达式可以通过将字符串指定给不同的部分进行匹配:
(?在字符串开头匹配
*
获取“golang是一种在
中使用的语言”
github
获取“github
”
要实现您的目标,一种可能成本高昂的方法是:
/^(?:(?!golang).)*github/
它的工作原理是确保“github
”前面的任何字符都不会开始序列“golang
”
所以
将打印出而不是golang:true
而
echo "golang is a language used in github" | perl -ne 'print q!Not golang: !, /^(?:(?!golang).)*github/ ? q!true! : q!false!'
将打印出而不是golang:false
另一种(较少混淆的)方法是进行两次连续测试:
/^(.*)github/ and $1 !~ /golang/
如果你要做几十行或几十万行,也许可以测试两种方法,找出哪一种更快?只需使用一个消极的前瞻锚定开始:
^(?!.*golang).*github
只需使用锚定的负面展望开始:
^(?!.*golang).*github
改善波希米亚人的
/^(?!.*golang.*github).*github/
改善波希米亚人的
/^(?!.*golang.*github).*github/
这将不正确地匹配github-golang
。这将不正确地匹配github-golang
。在您的示例中,模式在位置0处匹配。位置0前面不是紧跟着golang
,而是匹配*github
的字符串的开头。它是否需要匹配“java是github中使用的一种语言,但golang不是”
(其中github在golang之前)?在您的示例中,模式在位置0处匹配。位置0前面不是紧跟着golang
,而是匹配的字符串的开头。github
是否需要匹配”java是github中使用的语言,但golang不是“
(github在golang之前的位置)?