我有这个REGEX:
([A-Za-z]+[\w_]*)\s*\(([[A-Za-z]+[\w_]*\s,?]*)
这个REGEX应该找到这样的字符串:
foo(param1,param2,param3......)
第一组是名字(必须以字母开头),之后是第二组,我不确定。问题是我不知道会收到多少参数。第二部分假设找到零个或多个参数的串联,所有参数都采用相同的格式[A-Za-z]+[\w_]
。我尝试在其周围添加[]
,最后添加*
。我如何能够将所有参数匹配并提取到数组列表中?它甚至是一个正确的REGEX语法吗?
答案 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.Matcher
或java.util.Scanner
。对于快速而肮脏的解决方案,只需使用String.indexOf
找到分隔符,使用String.substring
从中提取单词。