Regex 限制XML模式中的单词列表

Regex 限制XML模式中的单词列表,regex,xsd,Regex,Xsd,我正在编写一个XML模式,需要防止元素的文本与某些值匹配。(例如,variableName元素不能与“int”、“byte”、“string”等匹配) 我曾尝试使用类似于“^(int | byte | string)”的模式元素的限制,但没有成功 你知道格式化正则表达式的方法吗,或者其他任何方法来实现这一点吗?如果没有负前瞻性,这是非常乏味的。附件是一个与一些单元测试一起工作的正则表达式。这是用Perl编写的,不是XSD,但它是非常基本的正则表达式,所以应该可以工作。。。在使用正则表达式之前,应

我正在编写一个XML模式,需要防止元素的文本与某些值匹配。(例如,variableName元素不能与“int”、“byte”、“string”等匹配)

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


你知道格式化正则表达式的方法吗,或者其他任何方法来实现这一点吗?

如果没有负前瞻性,这是非常乏味的。附件是一个与一些单元测试一起工作的正则表达式。这是用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);
}

它必须是W3C模式(又名“xml模式”)吗?或者一个标准的替代方案会像工作一样吗?我可能错了,但我认为它在组合限制方面有一些改进,包括能够进行交叉。

在三次检查XML Schema(XSD)正则表达式是否真的不支持任何使这项任务变得容易的功能(特别是lookaheads和anchors)后,我想出了一种似乎可行的方法。我使用了自由间距模式使其更易于阅读,但这是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
),但所有匹配项都隐式锚定在两端


我可以看到一个潜在的问题:如果关键字列表很长,您可能会遇到正则表达式长度的限制。

起初我认为这相对容易,比如定义所有关键字的枚举并将其反转。但似乎没有任何方法可以改变限制。对于正则表达式,这个问题迫切需要负lookahead,但它们也不受支持。我认为你可能被搞砸了。事实上,考虑到模式的结构,这似乎是不可能的。通常,我使用的模式有一个可接受元素的简短列表,或者一个可接受的模式匹配。模式结构不允许像您试图实现的那样使用负过滤器。@Alanmore我认为XSD的正则表达式不支持反转限制。但它确实允许多个否定限制,XML Schema 1.0规范本身只是在同一内容模型上强制执行所有模式。此模式将是已经使用W3C模式的系统的一部分,并包括对该标准的支持。所以,是的,我担心它一定是W3C。哇,谢谢你花了这么多精力想出这个。虽然很长,但它确实非常有效。