【问题标题】:Scanner - parsing code values using delimiter regex扫描仪 - 使用分隔符正则表达式解析代码值
【发布时间】:2012-06-04 00:09:48
【问题描述】:

我正在尝试使用扫描器从“p.addPoint(x,y);”形式的字符串中读取代码行

我追求的正则表达式格式是:

*anything*.addPoint(*spaces or nothing*,*spaces or nothing*

到目前为止我尝试过的方法不起作用:[[.]+\\.addPoint(&&[\\s]*[,[\\s]*]]

任何想法我做错了什么?

【问题讨论】:

  • [...] 定义了一个字符类,到目前为止你所拥有的完全被打破了。研究正则表达式中括号的含义,然后再试一次。
  • 我对空格或什么都没有感到困惑。只有空格,没有别的?你不是想捕捉数值吗?
  • 这是分隔符正则表达式,基本上是整数之间的分隔符。
  • [.+\\.addPoint(\\s*[,\\s*]] 也不起作用。

标签: java regex int java.util.scanner


【解决方案1】:

我在 Python 中对此进行了测试,但正则表达式应该可以转移到 Java:

>>> regex = '(\w+\.addPoint\(\s*|\s*,\s*|\s*\)\s*)'
>>> re.split(regex, 'poly.addPoint(3, 7)')
['', 'poly.addPoint(', '3', ', ', '7', ')', '']

您的正则表达式似乎严重错误。即使不是这样,在字符串开头匹配无限多次重复的 . 通配符可能会导致大量文本匹配实际上并不相关/不需要。

编辑:误解了原始规范。当前的正则表达式应该是正确的。

【讨论】:

  • 似乎不起作用...我的输入是 "poly.addPoint(3, 7); //#5" 注意,它应该同时接收 3 和 7。
  • 你从那个输入得到什么输出,你想要什么输出?更具体地说,您是否尝试在比赛中拆分字符串?您是否尝试对数值参数进行分组并提取它们?请提供更多详细信息。
  • 使用正则表达式作为扫描仪分隔符,我尝试使用 while(hasNextInt()) 并使用 nextInt(); 将 3 和 7 作为整数抓取;两次。那有意义吗?我没有从您的正则表达式中得到任何输出。
  • 我不熟悉那个特定的类,但是看看当前版本的正则表达式是否能满足你的需要。
  • 什么是 |在这种情况下是什么意思?
【解决方案2】:

另一种方式:

public class MyPattern {

    private static final Pattern ADD_POINT;
    static {
        String varName = "[\\p{Alnum}_]++";
        String argVal = "([\\p{Alnum}_\\p{Space}]++)";
        String regex = "(" + varName + ")\\.addPoint\\(" + 
                argVal + "," + 
                argVal + "\\);";
        ADD_POINT = Pattern.compile(regex);
        System.out.println("The Pattern is: " + ADD_POINT.pattern());
    }

    public void findIt(String filename) throws FileNotFoundException {
        Scanner s = new Scanner(new FileReader(filename));

        while (s.findWithinHorizon(ADD_POINT, 0) != null) {
            final MatchResult m = s.match();
            System.out.println(m.group(0));
            System.out.println("   arg1=" + m.group(2).trim());
            System.out.println("   arg2=" + m.group(3).trim());
        }
    }

    public static void main(String[] args) throws FileNotFoundException {
        MyPattern p = new MyPattern();
        final String fname = "addPoint.txt";
        p.findIt(fname);
    }

}

【讨论】:

    猜你喜欢
    • 2015-06-26
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    • 2013-01-03
    • 1970-01-01
    相关资源
    最近更新 更多