-5

根据这些规则,我需要一个用于 java 方法的正则表达式:

  1. 没有私人/公共或任何这些
  2. 只有 void 方法(没有返回方法)
  3. 方法名称必须以字母开头,但可以包含“_”或数字。

得到了方法名称"([a-zA-Z])\\w*" 的正则表达式:还有参数名称的正则表达式:"(_|[a-zA-Z])\\w*"

所以它就像:

void name (parameters) {

void 不会改变,根据我提供的正则表达式命名,参数可以是 final 和 int、string、char、double 和 boolean 但它可以是空白:()

任何帮助深表感谢 :)

4

2 回答 2

2

不要滥用 正则表达式来解析非常规语言。

您为此任务使用了错误的工具。

相反,使用 LALR(1) 语言的解析器,就像 Java 语法一样。

关于 LALR 解析器的维基百科:

https://en.wikipedia.org/wiki/LALR_parser

用于 LALR 语言的 Java 解析器生成器“CUP”:

http://www2.cs.tum.edu/projects/cup/

(而且使用 CUP 之类的工具为您编写解析器比使用 regexps 等不合适的工具自己编写解析器要聪明得多)

并猜测 CUP 包含的示例:

示例:Java 编程语言 1.0 到 1.5 的 CUP 语法

于 2013-06-02T14:19:19.237 回答
0

描述

这个正则表达式会拉出void后的name值,以及所有的参数

^\s*void\s+(\S+)\s+[(]([^)]*)[)]\s*[{]

在此处输入图像描述

团体

第 0 组获得整场比赛

  1. 得到名字
  2. 获取参数

Java 代码示例:

import java.util.regex.Pattern;
import java.util.regex.Matcher;
class Module1{
  public static void main(String[] asd){
  String sourcestring = "void name (parameters) {";
  Pattern re = Pattern.compile("^\\s*void\\s+(\\S+)\\s+[(]([^)]*)[)]\\s*[{]",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
  Matcher m = re.matcher(sourcestring);
  int mIdx = 0;
    while (m.find()){
      for( int groupIdx = 0; groupIdx < m.groupCount()+1; groupIdx++ ){
        System.out.println( "[" + mIdx + "][" + groupIdx + "] = " + m.group(groupIdx));
      }
      mIdx++;
    }
  }
}

$matches Array:
(
    [0] => Array
        (
            [0] => void name (parameters) {
        )

    [1] => Array
        (
            [0] => name
        )

    [2] => Array
        (
            [0] => parameters
        )

)
于 2013-06-02T20:49:00.073 回答