4
 Pattern[] a =new Pattern[2];
 a[0] = Pattern.compile("[$£€]?\\s*\\d*[\\.]?[pP]?\\d*\\d");
 a[1] = Pattern.compile("Rs[.]?\\s*[\\d,]*[.]?\\d*\\d");

例如:Rs.150被 检测到a[1]150被 检测到a[0]。如何删除这样的交叉点并让它只检测到a[1]而不是检测到a[0]

4

3 回答 3

0

您可以|在正则表达式中使用运算符。然后调用方法Matcher#group(int)以查看您的输入适用于哪种模式。null如果匹配组为空,则此方法返回。

示例代码

public static void main(String[] args) {
    // Build regexp
    final String MONEY_REGEX = "[$£€]?\\s*\\d*[\\.]?[pP]?\\d*\\d";
    final String RS_REGEX = "Rs[.]?\\s*[\\d,]*[.]?\\d*\\d";

    // Separate them with '|' operator and wrap them in two distinct matching groups
    final String MONEY_OR_RS = String.format("(%s)|(%s)", MONEY_REGEX, RS_REGEX);

    // Prepare some sample inputs
    String[] inputs = new String[] { "$100", "Rs.150", "foo" };

    Pattern p = Pattern.compile(MONEY_OR_RS);

    // Test each inputs
    Matcher m = null;
    for (String input : inputs) {
        if (m == null) {
            m = p.matcher(input);
        } else {
            m.reset(input);
        }

        if (m.matches()) {
            System.out.println(String.format("m.group(0) => %s\nm.group(1) => %s\n", m.group(1), m.group(2)));
        } else {
            System.out.println(input + " doesn't match regexp.");
        }
    }
}

输出

    m.group(0) => $100
    m.group(1) => 空

    m.group(0) => 空
    m.group(1) => Rs.150

    foo 与正则表达式不匹配。
于 2013-06-17T13:55:23.057 回答
0

使用初始测试在表达式之间切换。这个初始测试的速度和/或智能取决于您。

在这种情况下,您可以执行以下操作:

if (input.startsWith("Rs.") && a[1].matcher(input).matches()) {
    return true;
}

并将其放在进行测试的方法前面。

当然,简单地将最常见的正则表达式放在数组前面可能也会有所帮助。

于 2013-06-17T10:52:47.317 回答
0

描述

使用否定前瞻来匹配a[1] rs.150格式,同时阻止a[0] 150格式。

通用表达式:(?! the a[0] regex goes here ) followed by the a[1] expression

基本的正则表达式:(?![$£€]?\s*\d*[\.]?[pP]?\d*\d)Rs[.]?\s*[\d,]*[.]?\d*\d

为java转义:(?![$£€]?\\s*\\d*[\\.]?[pP]?\\d*\\d)Rs[.]?\\s*[\\d,]*[.]?\\d*\\d

在此处输入图像描述

于 2013-06-17T13:58:12.637 回答