2

我正在尝试为以下场景编写正则表达式。

它可以是简单的字母数字字符串(即使它是特殊字符也可以有'@')或字母数字字符串后跟括号中的参数列表或字母数字字符串后跟空白括号:

  1. My_macro -> 接受这个
  2. My_macro() -> 接受这个
  3. My_macro(arg1, arg2, arg3) -> 接受这个

我是正则表达式的新手,我阅读了一些教程并且可以形成这个正则表达式。

([a-zA-Z]+[a-zA-Z0-9_@]*) | ([a-zA-Z]+[a-zA-Z0-9_@.]+[\(][a-zA-Z]+[a-zA-Z0-9_@,]+[\)])

这是行不通的。

4

4 回答 4

2

我注意到的一些事情:

  • 第一部分(宏名)在所有情况下都会出现,因此您无需重复。(您可以使用“?”作为可选部分——parens 和 args 列表。)
  • +后面的表达式与后面的表达式是[a-zA-Z]多余的。*[a-zA-Z...]
  • 您可能/可能没有管道/条(“|”)周围的额外空间。这可能会弄乱您的正则表达式。
  • 您的示例在参数之间有空格,但您的正则表达式没有。

[更新] 另一个花絮:

  • 逗号很棘手。你基本上需要这样的东西:(请原谅我的伪正则表达式)

    (<arg 表达式> ([spaces]*[comma][spaces]*<arg 表达式>)* )?

...应该可以选择匹配括号内的所有内容。

于 2012-08-23T07:06:35.653 回答
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  

问题是你到底想要达到什么目的。为什么需要匹配这些字符串?无论如何,您的要求与大多数字符串匹配。

于 2012-08-23T07:19:11.930 回答
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*\)

顺便说一句,我不会使用单个正则表达式来执行此操作,而是首先获取标识符,然后去除括号,然后拆分参数列表。在代码中。

于 2012-08-23T07:05:39.107 回答
0

在 php 中它看起来像:

    $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)
)
于 2012-08-23T07:12:15.143 回答