我需要一些帮助,找出用于控制字符的XML字符引用的正则表达式,十进制或十六进制。
这些序列如下所示:
&安培;#0;
&安培;#X03;
&安培;#31;
&安培;#X1F;
&安培;#x1F的;
换句话说,它们是&符号,后跟一个磅,后跟一个可选的'x'表示十六进制模式,后跟1到4个十进制(或十六进制)数字,后跟一个分号。
我特意尝试识别那些包含十进制0到31或十六进制0到1F的(包含)数字的序列。
任何人都可以找出这个正则表达式吗?
答案 0 :(得分:3)
&#(0{0,2}[1-2]\d|000\d|0{0,2}3[01]|x0{0,2}[01][0-9A-Fa-f]);
这不是最优雅的,但应该有效。
在RegexBuddy中验证。
答案 1 :(得分:3)
如果使用zero-width lookahead assertion来限制数字位数,则可以编写模式的其余部分而不必担心长度限制。试试这个:
&#(?=x?[0-9A-Fa-f]{1,4})0*([12]?\d|3[01]|x0*1?[0-9A-Fa-f]);
说明:
(?=x?[0-9A-Fa-f]{1,4}) #Restricts the numeric portion to at most four digits, including leading zeroes.
0* #Consumes leading zeroes if there is no x.
[12]?\d #Allows decimal numbers 0 - 29, inclusive.
3[01] #Allows decimal 30 or 31.
x0*1?[0-9A-Fa-f] #Allows hexadecimal 0 - 1F, inclusive, regardless of case or leading zeroes.
此模式允许x
后的前导零,但(?=x?[0-9A-Fa-f]{1,4})
部分阻止 {/ 1}}之前发生。
答案 2 :(得分:2)
我认为以下内容应该有效:
&#(?:x0{0,2}[01]?[0-9a-fA-F]|0{0,2}(?:[012]?[0-9]|3[01]));
这是一个Rubular:
http://www.rubular.com/r/VEYx25Fdpj