正则表达式最后一次出现后仍然有关键字

时间:2016-09-29 15:22:41

标签: java regex selenium

对于Java selenium的原因,我需要最后一个字符串,后面还有一个关键字:

href="something "><br />
href="something else"> <br />
href="INeedThis"> </a> // <- i need this <br />
keyword <br />
href="something else">

所以我做了这个:

href=\"(?![\s\S]\*?href=\")([\s\S]\*?)\"[\s\S]\*?(?=keyword)

如果关键字后面没有href=",则可以使用。 文本"INeedThis"在我打算使用它的每种情况都有所不同。

2 个答案:

答案 0 :(得分:1)

假设我正确理解了这个问题,我认为这可能会满足您的需求:

href=\"([^\"]*?)\"((?!href).)*?(?=keyword)

说明:

  • href=\"([^\"]*?)\" - 匹配"之后href= s之间的内容
    • ([^\"]*?) - 懒惰地匹配任何不是"的字符。
  • ((?!href).)*? - 通过使用否定前瞻功能,Lazily匹配href未紧跟的任意数量的字符。基本上确保这是关键字之前的href
  • (?=keyword) - 使用正向前瞻确保我们匹配的href与关键字结合后立即跟随关键字,后者断言没有href s关键字与我们匹配的href之间。

行动中:https://regex101.com/r/NCJXbA/1

此模式将匹配关键字前面href的任意数量的实例,因此如果此模式有多个实例,则会捕获所有匹配项。

答案 1 :(得分:0)

此正则表达式捕获您的"INeedThis"

(?:.*href="[^"]*")*.*href="([^"]*)"(?=.*keyword)

如果输入字符串可以包含换行符,则会出现这种情况,那么您必须确保启用DOTALL选项。

String input =
        "href=\"something \">\n"
        + "href=\"something else\">\n"
        + "href=\"INeedThis\">\n"
        + "keyword\n"
        + "href=\"something else\">";

Pattern myPattern = Pattern.compile(
        "(?:.*href=\"[^\"]*\")*.*href=\"([^\"]*)\"(?=.*keyword)",
        Pattern.DOTALL);

Matcher m = myPattern.matcher(input);

if (m.lookingAt()) { // or maybe m.find(), but not m.matches()
    System.out.println(m.group(1));
} else {
    System.out.println("no match");
}

输出:

  

INeedThis

请注意,这对于href属性中使用的引用样式(与您的属性一样)很敏感,并且它不适应=周围的空白(与您的一样)。

这也是比你更普遍的模式。因此,它适用于从您描述的表单的输入中提取所需数据,但适合同时验证输入确实具有该表单。

此外,如果关键字可能出现多次,则此模式将选择在关键字最后一次出现之前出现的最后一个候选字符串,这可能在之前之后出现。