regex用于特定字符的第一个实例,它不会在另一个特定字符后立即出现

时间:2016-01-20 15:36:49

标签: regex grep

我有一个函数,translate(),有多个参数。第一个参数是唯一必需的,并且是一个字符串,我总是用单引号括起来,如下所示:

translate('hello world');

其他参数是可选的,但可以包含如下:

translate('hello world', true, 1, 'foobar', 'etc');

字符串本身可以包含转义的单引号,如下所示:

translate('hello\'s world');

到目前为止,我现在想要搜索所有代码文件以查找此函数调用的所有实例,并仅提取字符串。为此,我提出了以下grep,它返回 translate('')',之间的所有内容。几乎完美:

grep -RoPh "(?<=translate\(').*?(?='\)|'\,)" .

但问题是,如果调用是这样的话:

translate('hello \'world\', you\'re great!');

我的grep只会返回这个:

hello \'world\

所以我想修改这个,以便当前寻找'的部分',代替第一次出现'< / strong>尚未转义,即不会立即跟随 \

希望我有意义。有什么建议吗?

2 个答案:

答案 0 :(得分:2)

您可以将此<div style="clear: both;"> <div class="adcontainer"> <img src="https://cdn.shopify.com/s/files/1/0786/5107/files/LARGE_BANNER-BELOW.jpg?5938182738858039286" /> <div class="adcontainertext"> <h2 class="advertheading" style="font-weight: normal; color: #ffffff;">Join the club</h2> </div> </div> </div>grep正则表达式

一起使用
PCRE

Here is a regex demo

RegEx分手:

grep -RoPh "\btranslate\(\s*\K'(?:[^'\\\\]*)(?:\\\\.[^'\\\\]*)*'" .

以下是没有\b # word boundary translate # match literal translate \( # match a ( \s* # match 0 or more whitespace \K # reset the matched information ' # match starting single quote (?: # start non-capturing group [^'\\\\]* # match 0 or more chars that are not a backslash or single quote ) # end non-capturing group (?: # start non-capturing group \\\\. # match a backslash followed by char that is "escaped" [^'\\\\]* # match 0 or more chars that are not a backslash or single quote )* # end non-capturing group ' # match ending single quote 使用环视的版本:

\K

RegEx Demo 2

答案 1 :(得分:0)

我认为问题是.*?部分:?使其成为非贪婪模式,这意味着它将采用与模式匹配的最短字符串。实际上,你在说,&#34;给我一个最短的字符串,然后引用+ close-paren或quote +逗号&#34;。在您的示例中,&#34; world\&#34;之后是单引号和逗号,因此它与您的模式匹配。 在这些情况下,我喜欢使用类似以下的推理:

字符串是引号,零个或多个字符以及引号:'.*'

字符不是引号(因为引号终止字符串):'[^']*'

除非您可以通过使用反斜杠转义它来将字符串放入字符串中,因此字符可以是&#34;反斜杠后跟引号&#34;或者,如果没有,&#34;不是引用&#34;:'(\\'|[^'])*'

把它们放在一起,你就得到了

grep -RoPh "(?<=translate\(')(\\'|[^'])*(?='\)|'\,)" .