在JAVA中使用正则表达式从方法调用中提取参数

在JAVA中使用正则表达式从方法调用中提取参数,java,regex,Java,Regex,我有一个正则表达式: ([A-Za-z]+[\w_]*)\s*\(([[A-Za-z]+[\w_]*\s,?]*) 这个正则表达式应该查找如下字符串: foo(param1,param2,param3......) 第一组是名字(必须以字母开头),然后是第二组,我不确定。问题是我不知道我将收到多少参数。第二部分是假设找到零个或多个参数的串联,所有参数的格式都相同[a-Za-z]+[\w\uz]。我尝试在它周围添加一个[],并在末尾添加一个*。如何将所有参数匹配并提取到数组列表中?这是一个正确

我有一个正则表达式:

([A-Za-z]+[\w_]*)\s*\(([[A-Za-z]+[\w_]*\s,?]*)
这个正则表达式应该查找如下字符串:

foo(param1,param2,param3......)
第一组是名字(必须以字母开头),然后是第二组,我不确定。问题是我不知道我将收到多少参数。第二部分是假设找到零个或多个参数的串联,所有参数的格式都相同[
a-Za-z]+[\w\uz]
。我尝试在它周围添加一个
[]
,并在末尾添加一个
*
。如何将所有参数匹配并提取到数组列表中?这是一个正确的正则表达式语法吗?

您可以使用这个正则表达式

([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--------------------------------->

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

([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*\)
你可以使用这个正则表达式

([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--------------------------------->

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

([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*\)
你看不见

您所能做的最好的事情就是找到一个regexp(*),它将捕获一个组中的所有参数,然后用进一步的代码将其拆分

(*)类似于(未选中):

请注意,如果要处理真正的Java代码,则参数可以是字符串和数字文本、函数/方法调用或完整表达式,因此单个regexp无论如何都不会剪切它…

您不能(请参阅)

您所能做的最好的事情就是找到一个regexp(*),它将捕获一个组中的所有参数,然后用进一步的代码将其拆分

(*)类似于(未选中):


请注意,如果要处理真正的Java代码,参数可以是字符串和数字文本、函数/方法调用或完整表达式,因此单个regexp无论如何都不会剪切它…

您可以使用此regex:

([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]
      是第一个字母,必须是字母
    • [a-zA-Z0-9_$]*
      表示名称的其余部分,可能包括字母、数字、
      \uu
      $
  • \s*
    用于空格。(有些人把它们放在了一起。)
  • \(
    用于
  • \s*
    再次表示空格
  • [a-zA-Z0-9_$]+
    用于第一个参数
  • (?:\s*,\s*[a-zA-Z0-9_$]+)*
    用于其余参数。
    • \s*
      再次表示空格
    • 用于匹配
    • \s*
      再次表示空格
    • [a-zA-Z0-9_$]+
      用于参数名称
    • 开头的
      (?:
      )*
      查找尽可能多的额外参数
  • \s*
    再次表示空格
  • \)
    用于右括号

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

([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]
      是第一个字母,必须是字母
    • [a-zA-Z0-9_$]*
      表示名称的其余部分,可能包括字母、数字、
      \uu
      $
  • \s*
    表示空格。(有些人将其放在空格中。)
  • \(
    用于
  • \s*
    再次表示空格
  • [a-zA-Z0-9_$]+
    用于第一个参数
  • (?:\s*,\s*[a-zA-Z0-9_$]+)*
    用于其余参数。
    • \s*
      再次表示空格
    • 用于匹配
    • \s*
      再次表示空格
    • [a-zA-Z0-9_$]+
      用于参数名称
    • 开头的
      (?:
      )*
      查找尽可能多的额外参数
  • \s*
    再次表示空格
  • \)
    用于右括号

首先,您需要编写
(XXX)*
来说明
XXX
可以重复零次或多次,而不是“[XXX]*”


但是,尽管如此,您实际上无法编写一个正则表达式来实现您的想法;正则表达式没有那么强大。如果出于某种原因您特别热衷于使用正则表达式,请查看
java.util.regex.Matcher
java.util.Scanner
。要快速解决问题,只需使用
String.indexOf
>找到分隔符和
String.substring
以从它们之间提取单词。

首先,您需要编写
(XXX)*
以说明
XXX
可以重复零次或多次,而不是“[XXX]*”


但是,尽管如此,您实际上无法编写一个正则表达式来实现您的想法;正则表达式没有那么强大。如果出于某种原因您特别热衷于使用正则表达式,请查看
java.util.regex.Matcher
java.util.Scanner
。要快速解决问题,只需使用
String.indexOf
>查找分隔符和
字符串。子字符串
以从它们之间提取单词。

传递函数时会有参数吗?为什么要使用正则表达式而不是java解析库?传递函数时会有参数吗?为什么要使用正则表达式而不是java解析库?答案很完美。如果参数被单个qoute包围,您能告诉我们什么吗?例如:method('arg1','arg2','arg3')匹配组应该返回arg1 arg2 arg3。您的答案很完美。您能告诉我们如果参数被单个qoute包围,您能告诉我们什么吗?例如:method('arg1','arg2','arg3')匹配组应返回arg1 arg2 arg3。