在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。