我有一个函数,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>尚未转义,即不会立即跟随 \
希望我有意义。有什么建议吗?
答案 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
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
答案 1 :(得分:0)
我认为问题是.*?
部分:?
使其成为非贪婪模式,这意味着它将采用与模式匹配的最短字符串。实际上,你在说,&#34;给我一个最短的字符串,然后引用+ close-paren或quote +逗号&#34;。在您的示例中,&#34; world\
&#34;之后是单引号和逗号,因此它与您的模式匹配。
在这些情况下,我喜欢使用类似以下的推理:
字符串是引号,零个或多个字符以及引号:'.*'
字符不是引号(因为引号终止字符串):'[^']*'
除非您可以通过使用反斜杠转义它来将字符串放入字符串中,因此字符可以是&#34;反斜杠后跟引号&#34;或者,如果没有,&#34;不是引用&#34;:'(\\'|[^'])*'
把它们放在一起,你就得到了
grep -RoPh "(?<=translate\(')(\\'|[^'])*(?='\)|'\,)" .