我正在尝试为以下场景编写正则表达式。
它可以是简单的字母数字字符串(即使它是特殊字符也可以是'@')或字母数字字符串后跟括号中的参数列表或字母数字字符串后跟空白括号:
我是正则表达的新手,我阅读了一些教程,可以形成这个正则表达式。
([a-zA-Z]+[a-zA-Z0-9_@]*) | ([a-zA-Z]+[a-zA-Z0-9_@.]+[\(][a-zA-Z]+[a-zA-Z0-9_@,]+[\)])
这不起作用。
答案 0 :(得分:2)
我注意到的一些事情:
+
表达式之后的[a-zA-Z]
与*
表达式之后的[a-zA-Z...]
多余。[更新] 还有一个小问题:
逗号很棘手。你基本上需要这样的东西:(原谅我的伪正则表达式)
(< arg expression>([spaces] * [逗号] [空格] *< arg表达>)*)?
...应该可以选择匹配parens内的所有内容。
答案 1 :(得分:2)
^[\w@]+(\((\w+,?\s*)*\))?$
匹配:
My_macro(arg1, arg2, arg3)
My_macro(arg1)
My_macro
My_macro()
My_macro@()
^ # Line Start
[\w@]+ # Matches alphanumerics and @ => My_@macro
(\((\w+,?\s*)*\))? # Matches optional argument (empty) list (), (arg) and (arg1, arg2)
$ # Matches Line End
问题是你究竟想要实现的目标。为什么需要匹配这些字符串?无论如何,您的要求与大多数字符串匹配。
答案 2 :(得分:0)
[A-Za-z@][A-Za-z0-9@]*\s*\(\s*([A-Za-z@][A-Za-z0-9@]*\s*(\s*,\s*[A-Za-z@][A-Za-z0-9@]*\s*)+)?\s*\)
顺便说一句,我不会用一个正则表达式来做这个,但首先获取标识符,然后剥离parantheses,然后拆分参数列表。在代码中。
答案 3 :(得分:0)
看起来像:
$subject = "My_macro My_@acro My_macro() My_macro(arg1, arg2, arg3)";
$pattern = '![a-zA-Z0-9_@]+(\((([a-zA-Z0-9_@]+(\,\s)?){3})?\))?!';
preg_match_all($pattern, $subject, $matches);
print_r($matches[0]);
Array
(
[0] => My_macro
[1] => My_@acro
[2] => My_macro()
[3] => My_macro(arg1, arg2, arg3)
)