2016-11-23 4 views
0

RegExのパターンマッチングのためにCLRアセンブリを使用しています。私が持っているアセンブリはとてもシンプルです。誤ったデータを見つけようとしているパターンが、期間を許さないと私は信じています。ただし、ピリオドを含むデータはCLR-based UDFによって返されません。RegExパターンマッチングは期間が可能です

無効なデータがパターンを更新する可能性があることがわかりましたが、パターンはサードパーティのXMLスキーマからのものであり、使用しているパターンを変更することはできません。

私は、パターンによってどのキャラクタを取り上げるべきか、またはすべきではないかを検証する手段としてhttp://regexr.com/を使用してきました。以下のシナリオでは、ウェブサイトを使用しているときにパターンによってピリオド文字が有効ではありません。

私の実装で何か不足していますか?


文字列データ:照合さTEST. DATA

パターン:'([A-Za-z] ?)*[A-Za-z]'

正規表現CLRクラスメソッド:

[SqlFunction(IsDeterministic = true, IsPrecise = true)] 
public static bool RegExMatch(string pattern, string matchString) 
{ 
    if (string.IsNullOrEmpty(matchString) || string.IsNullOrEmpty(pattern)) 
     return false; 

    Regex r1 = new Regex(pattern.TrimEnd(null)); 
    return r1.Match(matchString.TrimEnd(null)).Success; 
} 

テST SQLコード:

SELECT 'TEST. DATA' AS TEST_STRING 
     , dbo.RegExMatch('([A-Za-z] ?)*[A-Za-z]', 'TEST. DATA') AS PatternMatch 
+0

このパターンは、入力テキストがアルファベット文字で終わることを実際に主張するだけです。あなたが '... a'をウェブサイトに置くと、成功したマッチが表示されます。 Regexパターンを更新できない場合は、何を提案するか分かりません。パターンにアンカーを追加すると、複数行のマッチングを行っているかどうかのニュアンスがわかります。'^ [A-Za-z] * [A-Za-z] $' – Jay

+0

ユーザ定義の正規表現を取得して*文字列全体*とマッチさせたい場合は、アンカーだけでなく外側グループ化。 '' $ ''、 'TEST。DATA') '' dbo.RegExMatch(CONCAT( '^:?'、 '(A-Za-z)?)* [A-Za-z]'、 ')$'を試してください。正規表現に交替演算子が含まれていると、それ以外の場合は破棄されます。 –

+0

[成功](https://msdn.microsoft.com/en-us/library/system.text.regularexpressions.group.success(v = vs.110).aspx)プロパティは、見つかった場合はtrueを返します一致し、[this](https://regex101.com/r/7dXE9j/1)によると、2つのマッチがあります。あなたがパターンを変えることができないと考えて、これを回避する方法を言うのは難しいです。あなたが渡されているサードパーティの正規表現のパターンは、真偽検証のために単に一致するだけでは不十分なので、あなたが "検証する"ものをより正確に定義する必要があると思います。 – Quantic

答えて

0

あなたはパターンは、サードパーティ製のXMLスキーマからのものであることに言及。正規表現のフレーバーは.NETと非常に似ています。そのため、すべてが.NETでうまく動作する可能性があります。しかし、すべてのXMLスキーマパターンはデフォルトでで固定されており、その正規表現フレーバは文字列の開始と文字列のアンカーとして^$をサポートしていません。意味

、あなたは(\zが望ましい)、文字列の末尾にマッチする文字列の先頭に一致する^/\A、あなたがテストする正規表現にアンカーを追加し、$/\zする必要があります。

このサポートを追加する最も安全な方法は、^(?:)$のパターンを囲むことです。

+0

あなたが書いたものでテストパターンを囲むことは今や 'TESTに失敗しています。 DATA'文字列の検証が行われているようです。あなたの経験では、記述したパターンを手動で囲むことで実際のテストパターンが変更されるのではなく、テストするのが有効になると思いますか? – Russ

+0

いいえ、この外側のグループ化は有効なアプローチです。[HTML5 'pattern'属性]内のregexpsのデフォルトのアンカーリングでも使用されます(https://www.w3.org/TR/html5/forms.html#the-pattern-属性)。 –

0

被験者のパターンがTESTに似ている場合。このようなパターンのDATAが働くはずです。

^([A-Za-z]+)(\.)?\s?([A-Za-z]+)$ 

現在のパターンは、1文字以上続く1つの以上の空白文字に続く0または1の期間に続いて、少なくとも1文字で開始する必要があります。

編集:ちょうどあなたの質問の第2段落を読んで、あなたはパターンを変更することができないことに気づいた。

+0

PS。文字列の最後に改行文字をマッチさせたくない場合は、$ for \ zを入れ替えることができます – WBuck

関連する問題