正则表达式:如何找到确切的值长度?

时间:2015-12-16 08:42:37

标签: java regex

我得到了几个给定String的案例:

  1. key1 = 12345
  2. 键1 = 12345&安培;键2 = 12345
  3. 键1 = 12345123456789
  4. 键1 = 12345123456789&安培;键2 = 123456789
  5. 使用此模式:(key1)=([^&]{5})(|$))

    预期结果如下:

    1. 12345
    2. 12345,12345
    3. 没有
    4. 没有
    5. 跑步时,结果如下:

      1. 12345
      2. 12345,12345
      3. 12345
      4. 12345,12345
      5. 这意味着{5}实际上剪切文字的给定长度为5,而不是寻找精确的5
        如何才能使其查找完整的5而不是剪切文本?

3 个答案:

答案 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])

  • 首先,我寻找一个=标志,但不要捕捉它。
  • 然后我找了5位数......
  • ...跟随&符号或换行符(我也没有捕获)

如果您只需查看key1, key2值,只需添加(?:key\d=)代替(?:=) - demo

然后找到的唯一匹配具有给定长度。

但是,

@Stribizhev's regex可能更安全,更多的是假阳性保护。

答案 2 :(得分:0)

([^=&]+)=(?<![^=&])([^=&]{5})(?![^=&])

键,然后是=,然后是五个不是=&的字符,不包含更多不是=&的字符。 (\b在有限的情况下很有用,在这种情况下,您的值只能由字母,数字和下划线组成;负面的外观更为通用)。