我已经创建了这个表达式
(?<=<)(.+?)(<|>)(.+?)(?=>)
我认为它会抓住位于<
和>
之间的<
或>
。
然而,例如在那种情况下
<#freemarker < template>
它被抓住了
#freemarker < template
而非<
。
理想情况下,我希望它能够抓住位于<
或>
和<#
之间的</#
和>
。
为了使其正常工作,应该改变什么?
答案 0 :(得分:0)
如果你真的需要只匹配<
或>
,我建议利用Java约束宽度的后视:
(?s)(?<=</?#.{0,1000})(?:<|>)(?=.*?>)
Demo:
使用这种方法,假设初始</?#
之后的字符串不长于1000,这对于实际情况应该足够了。
这是IDEONE demo:
String s = "<#freemarker < template>";
System.out.println(Arrays.toString(s.split("(?s)(?<=</?#.{0,1000})(?:<|>)(?=.*?>)")));
}
结果:[<#freemarker , template>]
答案 1 :(得分:0)
在Java中,您始终可以使用Matcher
方法start(int group)
和end(int group)
来获取您感兴趣的部分索引。所以只需使用:
(?<=<)(?:.+?)(<|>)(?:.+?)(?=>)
然后matcher.group(1)
获取匹配的字符串,或matcher.start(1)
和matcher.end(1)
获取匹配的片段的开始和结束索引。 ?:
用于避免捕获您不想在群组中捕获的片段。
Java中的示例:
public class Main {
public static void main(String[] args){
String example = "<#freemarker < template>";
Pattern pattern = Pattern.compile("(?<=<)(?:.+?)(<|>)(?:.+?)(?=>)");
Matcher matcher = pattern.matcher(example);
while(matcher.find()) {
System.out.println(example.substring(matcher.start(1), matcher.end(1)));
}
}
}