我得到了几个给定String的案例:
使用此模式:(key1)=([^&]{5})(|$))
。
预期结果如下:
跑步时,结果如下:
这意味着{5}
实际上剪切文字的给定长度为5
,而不是寻找精确的5
。
如何才能使其查找完整的5
而不是剪切文本?
答案 0 :(得分:1)
这种模式可以做到:
=([^&]{5})(?:&|$)
找到=
,然后是5个不是&
的捕获字符,后面跟着&
或字符串的结尾。
<强>测试强>
public static void main(String[] args) {
test("key1=12345");
test("key1=12345&key2=12345");
test("key1=12345123456789");
test("key1=12345123456789&key2=123456789");
}
private static void test(String input) {
Matcher m = Pattern.compile("=([^&]{5})(?:&|$)").matcher(input);
List<String> list = new ArrayList<>();
while (m.find())
list.add(m.group(1));
System.out.println(list);
}
输出
[12345]
[12345, 12345]
[]
[]
答案 1 :(得分:0)
基本上,你必须以某种方式添加边界。可以使用锚点(例如\b
表示“单词边界”,或^
和$
表示字符串/行边界)。其他方法是限制匹配,直到给定的字符出现 - 例如[^&\n]
- 直到&
符号或换行符,然后在Java中检查programmaticaly的长度。
我提出了我自己的正则表达式:demo here
(?:=)(\d{5})(?:[&|\n])
=
标志,但不要捕捉它。&
符号或换行符(我也没有捕获)如果您只需查看key1, key2
值,只需添加(?:key\d=)
代替(?:=)
- demo
然后找到的唯一匹配具有给定长度。
但是,@Stribizhev's regex可能更安全,更多的是假阳性保护。
答案 2 :(得分:0)
([^=&]+)=(?<![^=&])([^=&]{5})(?![^=&])
键,然后是=
,然后是五个不是=
或&
的字符,不包含更多不是=
或&
的字符。 (\b
在有限的情况下很有用,在这种情况下,您的值只能由字母,数字和下划线组成;负面的外观更为通用)。