为什么我的缓冲String不能与RegEx模式匹配?

时间:2019-05-10 17:59:07

标签: java regex

我创建了一个蓝牙数据侦听器,该侦听器将传入的数据存储到using FFTW using Plots using WAV, PlotlyJS snd, sampFreq = wavread("input.wav") N, _ = size(snd) t = 0:1/(N-1):1; s = snd[:,1] y = fft(s) y1 = copy(y) for i = 1:N if abs(y1[i]) > 800 y1[i] = 0 end end s_new = real(ifft(y1)) wavwrite(s_new, "output1.wav", Fs = sampFreq) y2 = copy(y) for i = 1:N if abs(y2[i]) < 800 y2[i] = 0 end end s_new = real(ifft(y2)) wavwrite(s_new, "output2.wav", Fs = sampFreq) sticks((abs.(y1))) sticks!((abs.(y2))) s1,k1 = wavread("output1.wav") s2,k2 = wavread("output2.wav") for i = 1:N s1[i] += s2[i] end wavwrite(s1, "output3.wav", Fs = sampFreq) 中,然后检查它是否与正则表达式模式匹配,然后重置String。这样做是因为数据不会在一个实例中全部到达,因此我在获取全文时可以使用它进行操作。例如,当我使用自己的方法通过蓝牙将String发送到设备并打印数据时,数据将像这样打印:

"Hello Android!"

#1 New data! "H"

如您所见,整个字符串无法在一个实例中发送,这意味着将发送两个字符串,并且我敢肯定,大多数人都知道这一点。这就是为什么我使用#2 New data! "ello Android!来帮助我。

相反,我在两个不同的字符之间发送了一个随机生成的数字,然后尝试解析它们。例如RegEx。现在,我想获取整数,以便可以使用它,例如将其解析为int或类似的东西。但是只有当我的"<128>"缓冲区获得要发送的全部数据时,该数据才由String模式决定,该模式类似于RegEx([<])(-?\d+)([>]) <character

问题在于,由于未知原因,它根本与模式不匹配。

followed by any positive/negative number followed by character '>'

这是实时输出:

String szBuffer = "";

if(mmInputStream.available() > 0) {
    StringBuilder builder = new StringBuilder();
    byte[] bData = new byte[1024];

    while(mmInputStream.available() > 0) {
        int read = mmInputStream.read(bData);
        builder.append(new String(bData, 0, read, StandardCharsets.UTF_8));
    }

    szBuffer += builder.toString();

    Log.d("SZ_BUFFER", szBuffer); // For this example, "<128>" gets sent into pieces.

    // <n>
    if(Pattern.matches("([<])(-?\\d+)([>])", szBuffer)) {
        Log.d("SZ_BUFFER_ISMATCH", "MATCH!");
        szBuffer = ""; // Reset the buffer for new data
    }
    else
        Log.d("SZ_BUFFER_ISMATCH", "NO MATCH...");
}

如您所见,它被分成两部分发送,但是当将整个文本放在一起时,它应该是一个匹配项,但不是。为什么?如果我将D/SZ_BUFFER: < D/SZ_BUFFER_ISMATCH: NO MATCH... D/SZ_BUFFER: <128> D/SZ_BUFFER_ISMATCH: NO MATCH... 替换为常量szBuffer,如下所示:

String

这是一个匹配项,这意味着该模式应该正确,但是当它检查if(Pattern.matches("([<])(-?\\d+)([>])", "<128>")) 时就永远不会匹配。

2 个答案:

答案 0 :(得分:1)

根据文档,Pattern.matches(regex,string)等效于Pattern.compile(regex).matcher(string).matches(),等效于string.matches(regex)。这意味着您正在检查整个字符串是否与正则表达式匹配。如果要检查字符串是否包含字符串结尾标记,可以改用Matcher.find

Pattern pattern = Pattern.compile("([<])(-?\\d+)([>])");

String szBuffer = "";

if(mmInputStream.available() > 0) {
    ...

    szBuffer += convertedBytes;

    Log.d("SZ_BUFFER", szBuffer); 

    // <n>
    if(pattern.matcher(szBuffer).find()) {
        Log.d("SZ_BUFFER_ISMATCH", "MATCH!");
        szBuffer = "";
    }
    else
        Log.d("SZ_BUFFER_ISMATCH", "NO MATCH...");
}

答案 1 :(得分:1)

问题在于数据包含不可见字符,这是通过使数据长度错误来确认的。解决方案是检查每个字符,然后仅在它们符合某些条件(如正则表达式方法)时存储它们:

for(char c : builder.toString().toCharArray()) {
    String s = String.valueOf(c);

    if(Pattern.matches("<|>|-|-?\\d+", s)){
        szBuffer += s;
    }
}

这不是最好也不是最干净的解决方案,但是它确实解决了我的问题。我仍在学习正则表达式以及算法中的许多组合。欢迎所有新建议,这些建议将添加到此建议的下方。