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
^[\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 に答える
2

私が気づいたいくつかのこと:

  • 最初の部分 (マクロ名) はすべての場合に存在するため、繰り返す必要はありません。(「?」は、オプションの部分 (括弧と引数のリスト) に使用できます。)
  • 式の+後の式は、次の[a-zA-Z]式と冗長です。*[a-zA-Z...]
  • パイプ/バー ("|") の周りに余分なスペースがある場合とない場合があります。これは正規表現を台無しにしている可能性があります。
  • あなたの例には引数の間にスペースがありますが、正規表現にはありません。

[更新] もう 1 つのヒント:

  • コンマは難しいです。基本的には次のようなものが必要です: (疑似正規表現を許してください)

    (<引数式> ([スペース]*[カンマ][スペース]*<引数式>)* )?

...オプションで、括弧内のすべてに一致する必要があります。

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