有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用正则表达式从使用xeger java库生成的字符串中解析id

我想在发送时隐藏我的身份证。为此,我使用xeger java库根据ID生成字符串并发送它。在接收端,我需要解析它以获得id的值。因此,我需要使用正则表达式来生成字符串并在接收端获取id

这是我根据正则表达式生成字符串的java代码。我正在使用xeger生成字符串。x是id的值,可以是任何整数值

int x = 2;
String regex = "(a|b)(1|1000)[cd]{3}["+x+"](a|b)[cd]{3}";
Xeger generator = new Xeger(regex);
String result = generator.generate();
System.out.println("Generated String is : " + result);

以下是该程序在不同运行期间生成的一些输出:

b1000dcc2bcdc
b1000dcc2bddc
a1000dcd2acdc

我只想使用正则表达式从生成的字符串中获取x值。我尝试使用正则表达式: (a|b)(1|1000)[cd]{3}(.)(a|b)[cd]{3}从生成的字符串中获取x的值,但它没有给我x的值。 我使用了https://regex101.com/在线正则表达式测试器和正则表达式,我用它来获取字符串b1000dcc2bcdc中x的值,它给了我四个匹配项:b,1000,2,b。我只需要x的值,它是2

我做错了什么


共 (1) 个答案

  1. # 1 楼答案

    我不懂Java,但这里的问题是,每对括号都会创建一个“匹配组”,这就是为什么每个括号表达式都会得到一个结果

    您可以通过在表达式之前添加“?:”来告诉正则表达式引擎不要捕获与特定括号对内的表达式匹配的任何子字符串,这是replace

    (a|b)(1|1000)[cd]{3}(.)(a|b)[cd]{3}
    

    (?:a|b)(?:1|1000)[cd]{3}(.)(?:a|b)[cd]{3}
    

    您还可以将“(a | b)”替换为“[ab]”,从语义角度来看,这是相同的:

    [ab](?:1|1000)[cd]{3}(.)[ab][cd]{3}
    

    在我们这样做的同时,考虑到您对第二组的选项是“1”和“1000”,您可以将1设为必填项,将三个零设为可选项:

    [ab]1(?:000)?[cd]{3}(.)[ab][cd]{3}
    

    但这可能只是为了它:)

    真正的解决方案是计算括号,并要求代码在匹配中为您提供正确的组,您使用的库应该有类似“result.getGroup(3)”或类似的内容