我有表结构,我需要捕获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);
答案 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分手:
\d+
- 匹配1位或更多位数(?!.*\d)
- 声称我们前面没有任何数字的否定前瞻