2013-05-29 19 views
6

文字クラス内でアンカーを使用することはできますか?これは動作しません:文字クラス内の正規表現アンカー

analyze-string('abcd', '[\s^]abcd[\s$]') 

それは、^$のように見えるとき、文字クラス内のリテラルとして扱われます。ただし、それらをエスケープする(\^\$)のいずれかが機能しません。

この表現を使用して単語境界を作成しようとしていますが(\bはXSLT/XQueryでは使用できません)、グループを使用しないことをお勧めします((^|\s))つまり、いくつかのシナリオでは、不要なキャプチャグループが大量になる可能性があり、不要なキャプチャグループ内に「本当の」キャプチャグループを見つける新しいタスクが作成されます。

+0

重複してこれを閉じると投票した人は、重複する疑いのある質問へのリンクを提供できますか? – LarsH

+0

@LarsHそれは私ではありませんでしたが、これは主張された欺瞞です:http://stackoverflow.com/questions/9622869/cvc-pattern-valid-value-a-is-not-facet-valid-with-respect- to-a-pattern-a-zaを使用します。いくつかの共通点があるが、私はそれが実質的に異なる問題だと思う。 – wst

答えて

4

私は答えはノーである、あなただけのリテラル文字として、[]にアンカーとして^$を含めることはできませんと信じています。 (私も以前もそうしたいと思っていました)

しかし、文字列の前後にスペースを入れて、単語の境界として\sを探して、アンカーに気を付けないでください。例えば。

analyze-string(concat(' ', 'abcd xyz abcd', ' '), '\sabcd\s') 

また、各\s+を望むかもしれないが、それは別の問題です。

+0

それはハックですが、私はそれを取るよ! – wst

0

最初の角括弧の後にキャレットを使用すると、文字クラスが無効になります。これは本質的に、あなたがやっていることの反対を与えます。つまり、文字クラスは文字クラスにない文字と一致します。否定された文字クラスも(見えない)改行文字と一致します。

おそらくネガティブな先読みを試みることができます。

(?!\s) 
+0

残念ながら、ルックアヘッド/ビハインドは、XQueryおよびXSLT仕様の正規表現には含まれていません。私はより明確に正規表現を更新しました - 私は実際に文字クラスにアンカーを含めることを意図しました。目的は、「スペースまたは開始/終了アンカー(キャプチャなし)」と一致することを要求することです。 – wst

2

analyze-stringを関数として使用している場合は、XSLTまたはXQueryのいずれかの3.0実装を使用していると考えられます。

その場合、「非キャプチャグループが利用できない」と言うのはなぜですか? XPath Functions and Operators 3.0 specは、「非キャプチャグループも認識されています。これらは(?:xxxx)という構文で示されています。

+0

MarkLogicには3.0のサブセットしか実装されていません。 – wst