私はXMLスキーマを作成しており、要素のテキストが特定の値と一致しないようにする必要があります。 (例えば、variableName要素は 'int'、 'byte'、 'string'などと一致できません)XMLスキーマの単語リストを制限する
"^(int | byte | string)"のようなパターン要素で制限を使用しようとしましたが、成功なし。
正規表現を書式設定する方法、またはこの方法を使用する他の方法をご存知ですか?
私はXMLスキーマを作成しており、要素のテキストが特定の値と一致しないようにする必要があります。 (例えば、variableName要素は 'int'、 'byte'、 'string'などと一致できません)XMLスキーマの単語リストを制限する
"^(int | byte | string)"のようなパターン要素で制限を使用しようとしましたが、成功なし。
正規表現を書式設定する方法、またはこの方法を使用する他の方法をご存知ですか?
XMLスキーマ(XSD)は本当には(特に先読みとアンカー)このタスクが簡単になるだろう機能のいずれかをサポートしていないが正規表現というトリプルチェックした後、私がいるようだなアプローチを作ってみました作業。フリースペースモードを使用して読みやすくしましたが、XSDフレーバーがサポートしていないもう1つの機能です。
[^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つの問題:キーワードのリストが長い場合は、正規表現の完全な長さの制限に対して実行する可能性があります。
うわー、これを考えてくれてありがとう。それは長いですが、それはすごくうまくいきます。 – andypaxo
否定的な先読みなしでは、これはかなり面倒です。添付されているいくつかのユニットテストで動作する正規表現です。これはPerlではなくXSDで書かれていますが、それはかなり基本的な正規表現ですので、動作するはずです...正規表現から空白を削除してから使用してください。空白を追加して読みやすくしました。
注:「\ A」と「\ z」がXSDで許可されているかどうかはわかりません。そうでない場合は、それぞれ "^"と "$"に置き換えてください。
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);
}
まず、すべてのキーワードの列挙を定義して反転させるなど、これは比較的簡単だと思いました。しかし、制限を逆転させる方法はないようです。正規表現に関しては、この問題は否定的な先読みのために叫ぶが、どちらもサポートされていない。私はあなたがうんざりかもしれないと思う。 –
実際、スキーマがどのように構造化されているかを考えれば、これは可能ではないようです。一般に、私が扱うスキーマには、受け入れられた要素の短いリスト、または受け入れられたパターン適合があります。スキーマ構造では、達成しようとしているようなネガティブフィルタは簡単には許可されません。 – patjbs
@AlanMoore私はXSDの正規表現が反転制限を有効にするとは思わない。しかし、それは複数の否定された制限を許し、XMLスキーマ1.0の仕様自体は、すべてのパターンを同じコンテンツモデル上に強制するだけです。 – Michael