正则表达式最后一次出现仍然有关键字后
问题描述:
对于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"
在我打算使用它的每种情况下都有所不同。
答
此正则表达式捕捉你"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属性使用(这是你的),并且它不围绕容纳空白=
(和你一样)。
这也是一个比你更普遍的模式。因此,它适用于从所描述的表单的输入中提取所需的数据,但它适用于同时验证输入确实具有该表单的形式,但它不是而是。
此外,如果关键字可能出现不止一次,那么这种格局将选择关键字的最后一个出场,之后较早关键字的出现可能发生之前出现的最后候选串。
答
假设我正确地理解这个问题,我想这可能就是你所需要的东西:
href=\"([^\"]*?)\"((?!href).)*?(?=keyword)
说明:
-
href=\"([^\"]*?)\"
-href=
-
之后匹配的
-
([^\"]*?)
- Lazily匹配任何不是的字符。
"
S之间的内容 -
-
((?!href).)*?
- 懒洋洋匹配任何数目的没有紧跟href
使用负先行的字符。基本上确保这是关键字之前的href
。 -
(?=keyword)
- 使用积极的前瞻,以确保我们匹配href
后面紧跟着的关键字时,与声称有该关键字和我们相匹配的href
之间没有href
S中的负前瞻相结合。
在行动:https://regex101.com/r/NCJXbA/1
此模式将匹配任何数量的前述的关键字href
实例,因此,如果有这种模式的多个实例的比赛都捕获。
+0
大多数,但我怎么只选择最后一场比赛? –
你能更清楚一点你想匹配什么吗? –
评论晚了点,但是,我需要“”之间的一切。基本上文字INeedThis –