限制XML模式中的单词列表

时间:2009-05-01 19:07:15

标签: regex xsd

我正在编写XML模式,需要阻止元素的文本匹配某些值。 (例如,variableName元素不能匹配'int','byte','string'等。)

我尝试使用类似于“^(int | byte | string)”的模式元素的限制,但没有成功。

您是否知道格式化正则表达式的方法,或其他任何方法来使其工作?

3 个答案:

答案 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);
}