Java 常规经验:匹配器:如何获取组中的最后一次出现
我有一个表结构,需要在其中捕获身份验证代码。我使用了regex和matcher方法find()。然而,将有多个代码生成,我需要得到最近的一个。我尝试了下面的代码,它只捕获了第一次出现。请让我知道如何捕获代码的最后一次出现 代码: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()
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);
}