使用JAVA中的REGEX从方法调用中提取参数

时间:2016-06-05 12:23:16

标签: java regex

我有这个REGEX:

([A-Za-z]+[\w_]*)\s*\(([[A-Za-z]+[\w_]*\s,?]*)

这个REGEX应该找到这样的字符串:

foo(param1,param2,param3......)

第一组是名字(必须以字母开头),之后是第二组,我不确定。问题是我不知道会收到多少参数。第二部分假设找到零个或多个参数的串联,所有参数都采用相同的格式[A-Za-z]+[\w_]。我尝试在其周围添加[],最后添加*。我如何能够将所有参数匹配并提取到数组列表中?它甚至是一个正确的REGEX语法吗?

4 个答案:

答案 0 :(得分:2)

您可以使用此正则表达式:

([a-zA-Z][a-zA-Z0-9_$]+)\s*\(\s*([a-zA-Z0-9_$]+(?:\s*,\s*[a-zA-Z0-9_$]+)*)\s*\)
  • ([a-zA-Z][a-zA-Z0-9_$]+)部分
    • [a-zA-Z]是第一个charcater - 必须是一封信。
    • [a-zA-Z0-9_$]*用于名称的其余部分 - 可能包括字母,数字,_$
  • \s*代表空格。 (有些人把它们放了。)
  • \(代表(
  • \s*再次用于空格。
  • [a-zA-Z0-9_$]+用于第一个参数。
  • (?:\s*,\s*[a-zA-Z0-9_$]+)*用于其余参数。
    • \s*再次用于空格。
    • ,用于匹配,
    • \s*再次用于空格。
    • [a-zA-Z0-9_$]+用于参数名称。
    • 开头(?:)*会找到尽可能多的额外参数。
  • \s*再次用于空格。
  • \)用于结束括号。

答案 1 :(得分:0)

您可以使用此正则表达式

([A-Za-z]\w*)\s*\(\s*[A-Za-z]\w*\s+[A-Za-z]\w*\s*(?:,\s*[A-Za-z]\w*\s+[A-Za-z]\w*\s*)*\)
                 <----------------------------2nd part--------------------------------->

Regex Breakdown (第2部分)

\( #Match ( literally
  \s* #Match the spaces after (
  [A-Za-z]\w* #Match return type like int, float, String
  \s+ #Match at least one space
  [A-Za-z]\w* #Match variable names
  \s* #Match if there are any spaces
    (?:
      , #Match , literally
      \s* #Match spaces
       [A-Za-z]\w* #Match return type like int, float, String
       \s+ #Match at least one space
       [A-Za-z]\w* #Match variable names
       \s* #Match any number of spaces
    )* #Repeat this 0 or more times
\) #Match ) literally

<强> Regex Demo

以上将需要至少一个参数。如果您不想要任何参数,可以使用

([A-Za-z]\w*)\s*\((?:\s*[A-Za-z]\w*\s+[A-Za-z]\w*\s*(?:,\s*[A-Za-z]\w*\s+[A-Za-z]\w*\s*)*)?\s*\)

答案 2 :(得分:0)

你不能(见here)。

你能做的最好的事情是提出一个regexp(*),它将捕获一个组中的所有参数,然后用更多代码将其拆分。

(*)类似(未选中):

([A-Za-z]+[\w_]*(\s*,\s*[A-Za-z]+[\w_]*)*)

请注意,如果这应该处理真正的Java代码,参数可以是字符串和数字文字,函数/方法调用或完整表达式,因此单个正则表达式无论如何都不会削减它......

答案 3 :(得分:0)

首先,您要写(XXX)*来表示XXX可以重复零次或多次,而不是`[XXX] *&#39;。

然而,话虽如此,你实际上不能写一个正则表达式来做你想到的事情;正则表达并不强大。如果您因某些原因特别热衷于使用正则表达式,请查看java.util.regex.Matcherjava.util.Scanner。对于快速而肮脏的解决方案,只需使用String.indexOf找到分隔符,使用String.substring从中提取单词。