如何解决正则表达式用于函数调用?
| 我想从函数调用中简单地提取一些引用的文本,并且想知道我是否可以在正则表达式方面获得一些帮助? 该字符串如下所示: \'MyFunction(\“ MyStringArg \”); \' 从本质上讲,我想扫描文件以查找任何调用\'MyFunction \'的行,然后在引号中捕获字符串文字。 后续问题 我将如何避免与此相关的注释行? 更新资料 我能够通过以下方式解决我的问题:MyFunction\\s*\\(\\s*\"(.*?)\\\"\\s*\\)\\s*;
感谢@devyndraen和大家的帮助!
解决方法
我不确定您对格式化有什么样的要求,所以我包括了这样一个假设,即在正常的编程位置中可能有任何空间。
结果字符串将位于\\ 1反向引用中。
MyFunction\\s*\\(\\s*\"(.*?)\\\"\\s*\\)\\s*;
http://rubular.com/r/qVsaqJS6gJ
, 我建议使用带有标志s
的非贪婪正则表达式(Java中的DOTALL)(假设此函数调用的括号内没有注释:
$regex = \'/MyFunction.*?\\(.*?\"(.*?)\".*?\\).*?;/s\';
如果使用preg_match($regex,$str,$matches)
,则参数将在$matches[1]
中可用。
, 为了补偿注释的行或块,在应用正则表达式之前,您首先需要过滤文件以删除所有注释。对于PHP,可以使用以下命令:
$example=\'
line 1
line 2 // comment 1
line 3 # comment 2
// comment 3.1
# comment 3.2
/*
comment 4.1
comment 4.2
*/
line 9 /* comment 5.1
comment 5.2
*/\';
echo \'<h3>Example Text</h3><pre>\'.$example.\'</pre><hr>\';
$regex=\'/
(?x)
(?:
# single-line inline comments beginning at col#1
(?s)
(?:\\\\/\\\\/|\\\\#)
[^\\\\n]+
\\\\n
|
# single-line inline comments beginning after col#1
# preserve leading content
(?m)
^
(.+?)
(?:\\\\/\\\\/|\\\\#)
.*?
$
|
# multi-line comments
(?s)
\\\\/
\\\\*
(?:.|\\\\n)*?
\\\\*
\\\\/
)
/x\';
echo \'<h3>Regular Expression</h3><pre>\'.$regex.\'</pre><hr>\';
$result=preg_replace( $regex,\'$1\',$example);
echo \'<h3>Result</h3><pre>\'.$result.\'</pre><hr>\';
产生:
范例文字
1行
第2行//评论1
第3行#评论2
//评论3.1
#评论3.2
/ *
评论4.1
评论4.2
* /
第9行/ *评论5.1
评论5.2
* /
正则表达式
/
(?X)
(?:
#从col#1开始的单行内联注释
(?s)
(?:\\ / \\ / | \\ ##)
[^ \\ n] +
\\ n
|
#在col#1之后开始的单行内联注释
#保留主要内容
(?m)
^
(。+?)
(?:\\ / \\ / | \\ ##)
。*?
$
|
#多行注释
(?s)
\\ /
\\ *
(?:。| \\ n)*?
\\ *
\\ /
)
/X
结果
1行
2号线
3号线
9号线
, [^(]*(\"([^\"]*)\")
然后组号1将是带引号的字符串。不过,您必须自己重新引用。
(这不是高度科学,因为它很可能会拾取一些您不想要的东西)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。