在一行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之前的位置)?