2016-09-29 86 views
1

对于Java硒的原因,我需要一个字符串中最后一次出现仍然有后一个关键词:正则表达式最后一次出现仍然有关键字后

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"在我打算使用它的每种情况下都有所不同。

+1

你能更清楚一点你想匹配什么吗? –

+0

评论晚了点,但是,我需要“”之间的一切。基本上文字INeedThis –

回答

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属性使用(这是你的),并且它不围绕容纳空白=(和你一样)。

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

此外,如果关键字可能出现不止一次,那么这种格局将选择关键字的最后一个出场,之后较早关键字的出现可能发生之前出现的最后候选串。

1

假设我正确地理解这个问题,我想这可能就是你所需要的东西:

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

说明:

  • href=\"([^\"]*?)\" - href=
      之后匹配的 " S之间的内容
    • ([^\"]*?) - Lazily匹配任何不是的字符。
  • ((?!href).)*? - 懒洋洋匹配任何数目的没有紧跟href使用负先行的字符。基本上确保这是关键字之前的href
  • (?=keyword) - 使用积极的前瞻,以确保我们匹配href后面紧跟着的关键字时,与声称有该关键字和我们相匹配的href之间没有href S中的负前瞻相结合。

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

此模式将匹配任何数量的前述的关键字href实例,因此,如果有这种模式的多个实例的比赛都捕获。

+0

大多数,但我怎么只选择最后一场比赛? –

相关问题