正则表达式匹配最后一次出现而没有前瞻

时间:2014-07-15 15:23:53

标签: regex grep

我正在寻找一种在Mac OS上使用grep匹配字符串部分的方法,据我所知,不支持Perl正则表达式。我已经看到了有关安装ack和其他工具的建议,但遗憾的是这不是一个选项。

实施例: 我有以下字符串: "very programming", "much foo", "such, \"bar\""并希望匹配, "such, \"bar\"",即最后一个令牌。问题在于,无论我如何构造正则表达式,它都只匹配, "much foo", "such, \"bar\"",因为中间标记也以,开头(逗号后跟空格)。

编辑:在字符串中添加了引号和逗号。

我目前正在使用正则表达式:

, "[a-zA-Z0-9 !@#\$%\^\\&\*()\.,\-\+'"]*"

阐释:

, " followed by
A character class containing all valid characters repeated followed by
")

以下是一个互动示例:http://regexr.com/395id

所以我想知道,对于grep可用的正则表达式,有没有办法做到这一点?

2 个答案:

答案 0 :(得分:1)

我没有尝试过以下任何一个命令,所以如果发现任何错误,请告诉我,我可以修复它,或者如果你有修复程序就修复它:)

首先,我认为你想要使用的是一个结束$字符的行,所以你的正则表达式就是这样:

, "[a-zA-Z0-9 !@#\$%\^\\&\*()\.,\-\+'"]*"$

其次,perl可能已经安装在您的系统上(如果不是,我会感到惊讶;它现在安装在大多数UNIX系统上),在这种情况下,这是一个技巧:

echo '"very programming", "much foo", "such \\"bar\\""' | \
    perl -p -e 'if (/(, [a-zA-Z0-9 !@#\$%\^\\&\*()\.,\-\+'"]*)$/) { print $1 }'

上面的命令说'从标准输入中取出每一行,并将行的值分配给$_-p)。然后在其上运行此perl命令(-e)。瞧! UNIX上的perl regex。

第三,这里有一些可能有用的UNIX-ish正则表达式工具:

awk可能是你的朋友:

awk -F' *, *' '{print $3}'

awk命令说'将字符串拆分为基于空格,而不是逗号,然后是空格,并打印第三个字段'。这实际上只会打印"such \"bar\"",但这可能就是您要找的全部内容。

sed也是一个很好的工具:

echo '"very programming", "much foo", "such \\"bar\\""' | \
     sed 's/^.*\(, [[:alnum:][:punct:]]*\)$/\1/g'

该命令说'在整行中查找我们想要的正则表达式,匹配并打印出来'。它应该打印出你正在寻找的, "such \"bar\""

sed使用“基本”,awk使用“扩展”POSIX regular expressions。这些不仅仅是perl的,但它们非常接近。例如,在上面的例子中,我在括号内使用[:alnum:][:punct:] POSIX字符类,类似于Perl的字符类,但是POSIX。更重要的是,这两个命令在大多数POSIX系统上都有,包括Mac。

附注:您也可以使用POSIX character classes in perl

echo '"very programming", "much foo", "such \\"bar\\""' | \
    perl -p -e 'if (/(, [[:alnum:][:punct:]]*)$/) { print $1 }'

答案 1 :(得分:1)

这有点棘手,但这个正则表达式在我对OSX 的测试中对我有用,而不使用前瞻或后视

s='"very programming", "much foo", "such, \"bar\""'
egrep -o ', "(?:[^"\\]*\\")*[^"\\]*"[^"]*$' <<< "$s"
, "such, \"bar\""

Online Regex Demo