常规Exp:匹配器:如何在组中获得最后一次出现

时间:2017-04-01 11:41:24

标签: java regex selenium-webdriver

我有表结构,我需要捕获Auth代码。我使用了正则表达式和匹配器方法find()。但是,会生成多个代码,我需要获取最近的代码。我尝试下面的代码,只捕获第一次出现。请告诉我如何捕获最后一次出现的代码。

代码:

String mobilenumber="00955555555555"; 

//Date validate = null;

    {
    List<WebElement> rows = driver1.findElements(By.cssSelector("tr"));
    for (WebElement row : rows)
    {
        String text = row.getText();
        if (text.contains(mobilenumber))
        {
            String regex = ": (\\d+)"; //Your authentication code is
            Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher(text);

            if (matcher.find())             
                 {

                valueis = matcher.group(1);
                System.out.println(valueis);

2 个答案:

答案 0 :(得分:2)

有更多的方法可以获得这个(也许并不奇怪)。这是一对夫妇。

一,保持匹配,直到没有更多的匹配。最后一场比赛是 - 最后一场比赛。

        String valueis = null;
        while (matcher.find()) {
            valueis = matcher.group(1);
        }
        System.out.println(valueis);

两个,或者在你的正则表达式中,首先匹配冒号和数字之前的字符串:

        String regex = ".*: (\\d+)"; // Your authentication code is

由于*量词是贪婪的,所以这将首先匹配最后一个数字。对于后者的简单测试,请尝试:

    String regex = ".*: (\\d+)";
    Pattern pattern = Pattern.compile(regex);

    String text = "00955555555555 auth: 44; auth: 77 end";
    Matcher matcher = pattern.matcher(text);
    if (matcher.find()) {
        String valueis = matcher.group(1);
        System.out.println(valueis);
    }       

这会打印77

从讨论中我收集到每个表行(<tr>元素)中只有一个身份验证代码(一个正则表达式匹配),但是同一个移动号码可能出现在多个表行中,如果是这样的话,你想要最后一次(最近的)发生。这似乎不是正则表达式问题,而是程序逻辑问题。这是我尝试解决它:

    String regex = ": (\\d+)"; // Your authentication code is
    Pattern pattern = Pattern.compile(regex);

    String valueis = null;
    for (WebElement row : rows) {
        String text = row.getText();
        if (text.contains(mobilenumber)) {
            Matcher matcher = pattern.matcher(text);

            if (matcher.find()) {
                valueis = matcher.group(1);
            }
        }
    }
    if (valueis == null) {
        System.out.println("Not found");
    } else {
        System.out.println("Last occurrence was " + valueis);
    }

答案 1 :(得分:0)

如果你想在输入中使用最后一组数字,那么使用带有负前瞻的正则表达式:

\d+(?!.*\d)

在Java中:

String regex = "\\d+(?!.*\\d)";

RegEx Demo

RegEx分手:

  • \d+ - 匹配1位或更多位数
  • (?!.*\d) - 声称我们前面没有任何数字的否定前瞻