Java 常规经验:匹配器:如何获取组中的最后一次出现

Java 常规经验:匹配器:如何获取组中的最后一次出现,java,regex,selenium-webdriver,Java,Regex,Selenium Webdriver,我有一个表结构,需要在其中捕获身份验证代码。我使用了regex和matcher方法find()。然而,将有多个代码生成,我需要得到最近的一个。我尝试了下面的代码,它只捕获了第一次出现。请让我知道如何捕获代码的最后一次出现 代码: String mobilenumber=“009555”; //日期验证=空; { 列表行=driver1.findElements(By.cssSelector(“tr”); for(WebElement行:行) { String text=row.getText()

我有一个表结构,需要在其中捕获身份验证代码。我使用了regex和matcher方法find()。然而,将有多个代码生成,我需要得到最近的一个。我尝试了下面的代码,它只捕获了第一次出现。请让我知道如何捕获代码的最后一次出现

代码:

String mobilenumber=“009555”;
//日期验证=空;
{
列表行=driver1.findElements(By.cssSelector(“tr”);
for(WebElement行:行)
{
String text=row.getText();
if(text.contains(mobilenumber))
{
String regex=“:(\\d+”;//您的身份验证代码为
Pattern=Pattern.compile(regex);
Matcher Matcher=pattern.Matcher(文本);
if(matcher.find())
{
valueis=匹配器组(1);
系统输出打印项次(valueis);

如果您希望输入中的最后一组数字,请使用此正则表达式并进行负前瞻:

\d+(?!.*\d)
在Java中:

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

正则表达式分解:

  • \d+
    -匹配一个或多个数字
  • (?!.*\d)
    -表示前面没有任何数字的负前瞻性
    • 有(也许并不奇怪)更多的方法可以达到这一目的。以下是一些方法

      第一,保持匹配,直到没有更多匹配。最后一个匹配是-最后一个匹配

              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

      从讨论中,我发现每个表行(
      元素)中只有一个身份验证代码(一个regex匹配),但同一个手机号码可能出现在多个表行中,如果是,则需要最后一个(最近的)这似乎不是正则表达式的问题,而是程序逻辑的问题。以下是我试图解决的问题:

          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);
          }
      

      可能重复我尝试添加*量词,但我看不到我还想验证的内容。先前生成的代码已被选中,但新生成的代码未被选中。这是否意味着它出现在先前的
      WebElement
      中,还是在同一
      WebElement
      的文本中较早?它出现在标记I中n一个表,每次生成验证码时,它都会在任何标记中动态显示。是的,手机号码出现在多个表行中,我需要捕获最新的一行。对不起,如果我不知道,请告诉我。您是否查看了演示?如果没有看到您的输入,我们如何才能看到什么是验证码以及
      000
          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);
          }