我正在编写XML模式,需要阻止元素的文本匹配某些值。 (例如,variableName元素不能匹配'int','byte','string'等。)
我尝试使用类似于“^(int | byte | string)”的模式元素的限制,但没有成功。
您是否知道格式化正则表达式的方法,或其他任何方法来使其工作?
答案 0 :(得分:6)
在三重检查后,XML Schema(XSD)正则表达式确实不支持任何使这项任务变得容易的功能(特别是前瞻和锚点),我想出了一个似乎有效的方法。我使用自由间距模式使其更容易阅读,但这是XSD风格不支持的另一个功能。
[^ibs].* |
i(.{0,1} | [^n].* | n[^t].* | nt.+) |
b(.{0,2} | [^y].* | y[^t].* | yt[^e].* | yte.+) |
s(.{0,4} | [^t].* | t[^r].* | tr[^i].* | tri[^n].* | trin[^g].* | tring.+)
第一个选项匹配任何不以任何关键字的首字母开头的内容。每个其他顶级备选项都匹配一个字符串,该字符串以与其中一个关键字相同的字母开头,但是:
请注意,XSD正则表达式不支持显式锚点(即^
,$
,\A
,\z
),但所有匹配都隐式锚定在两端。
我可以看到一个潜在的问题:如果关键字列表很长,你可能会遇到正则表达式的绝对长度限制。
答案 1 :(得分:1)
是否必须是W3C Schema(又名“xml架构”)?或者像RelaxNG这样的标准替代方案是否有效?我可能错了,但我认为它在结合限制方面有一些改进,包括做交叉的能力。
答案 2 :(得分:0)
没有负面的预测,这是非常繁琐的。附件是一个与一些单元测试一起使用的正则表达式。这是用Perl编写的,而不是XSD,但它是非常基本的正则表达式,所以它应该可以工作......你应该在使用之前从正则表达式中删除空格。我添加了空格只是为了让它更容易阅读。
注意:我不知道XSD中是否允许“\ A”和“\ z”。如果没有,分别替换为“^”和“$”。
use Test::More 'no_plan';
my $re = qr/\A(\z|[^ibs]
|i(\z|[^n]|n(\z|[^t]|t.))
|b(\z|[^y]|y(\z|[^t]|t(\z|[^e]|e.)))
|s(\z|[^t]|t(\z|[^r]|r(\z|[^i]|i(\z|[^n]|n(\z|[^g]|g.))))))/x;
for my $str ( qw(inter bytes ins str strings in sdgsdfger i b s by byt bite st \
str stri strin strink) ) {
like($str, $re, $str);
}
for my $str ( qw(int byte string) ) {
unlike($str, $re, $str);
}