有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我有一个正则表达式:

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

这个正则表达式应该查找如下字符串:

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

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


共 (4) 个答案

  1. # 1 楼答案

    你可以使用这个正则表达式:

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

    首先,你想写(XXX)*来说明XXX可以重复零次或更多次,而不是“[XXX]*”

    然而,尽管如此,你实际上无法编写一个正则表达式来实现你的想法;正则表达式没有那么强大。如果出于某种原因,您特别喜欢使用正则表达式,请查看java.util.regex.Matcherjava.util.Scanner。对于快速而肮脏的解决方案,只需使用String.indexOf来定位分隔符,并使用String.substring从它们之间提取单词

  3. # 3 楼答案

    你不能(见here

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

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

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

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

  4. # 4 楼答案

    你可以用这个正则表达式

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

    正则表达式分解(第二部分)

    \( #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*\)