如何使用Regex创建“块”

时间:2017-04-13 12:30:58

标签: regex expression block

对于我的项目,我想用Regex创建“块”。

\xyz\yzx //wrong format
x\12 //wrong format
12\x //wrong format
\x12\x13\x14\x00\xff\xff //correct format

使用Regex101测试我的正则表达式时,我来到this结果:

([\\x(0-9A-Fa-f)])/gm

这会导致输出错误,因为

12\x

仍然会被检测为正确的字符串,虽然顺序错误,但它必须按照下面指定的顺序,而不是其他顺序。

backslash x 0-9A-Fa-f 0-9A-Fa-f

任何人都可以解释这是如何工作的以及为什么它以这种方式工作?提前谢谢!

1 个答案:

答案 0 :(得分:1)

要匹配\,后跟x,后跟2个十六进制字符,字符串中的任何位置,您需要使用

\\x[0-9A-Fa-f]{2}

请参阅regex demo

要强制它匹配所有非重叠的事件,请使用特定的修饰符(如JavaScript / Perl中的/g)或编程语言中的特定函数(.NET中的Regex.Matches或{{1在PHP等等。)。

^(?:\\x[0-9A-Fa-f]{2})+$正则表达式验证包含上述模式的整个字符串。它发生的原因是preg_match_all(字符串的开头)和^(字符串的结尾)锚点。请注意$是一个非捕获组,可以在字符串中重复1次或更多次(由于(?:...)+量词)。

一些Java demo

+

请注意,如果我们在模式的开头添加不区分大小写的修饰符String s = "\\x12\\x13\\x14\\x00\\xff\\xff"; // Extract valid blocks Pattern pattern = Pattern.compile("\\\\x[0-9A-Fa-f]{2}"); Matcher matcher = pattern.matcher(s); List<String> res = new ArrayList<>(); while (matcher.find()){ res.add(matcher.group(0)); } System.out.println(res); // => [\x12, \x13, \x14, \x00, \xff, \xff] // Check if a string consists of valid "blocks" only boolean isValid = s.matches("(?i)(?:\\\\x[a-f0-9]{2})+"); System.out.println(isValid); // => true ,或者只使用与任何字母数字匹配的[a-zA-Z],我们可能会将[a-z]缩短为(?i) Java正则表达式中的char。

默认情况下,\p{Alnum}方法始终锚定正则表达式,在使用其中的模式时,我们不需要前导String#matches和尾随^锚点。