对于我的项目,我想用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
任何人都可以解释这是如何工作的以及为什么它以这种方式工作?提前谢谢!
答案 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
和尾随^
锚点。