$re = '/(\w+?)\s+?(#\s*?\(.*?\)\s*?)?(\w+?(?:\[\d+?\])??)\s*?\(/m';
$str = 'second_module #(2) inst2 (.in2(sig2), .out2(sig3));
third_module inst3 (.in3(sig3), .out3(sig4));
fourth_module #(.in4_clk_freq(50), .in4_rst_val(1\'b0)) inst4 (.in4_clk(clk), .in4_rst(rst), .in4_in1(sig4), .in4_in2(sig5), .out4(sig6));';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
// Print the entire match result
var_dump($matches);
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for PHP, please visit: http://php.net/manual/en/ref.pcre.php