2016-10-28 11 views
2

私は複数の列の値をチェックする正規表現のリストを持っています。列はタブ区切り記号で区切られます。私は必要な32の列と、別の12の列を持っています。だから私のファイルが合計44の列を持っているなら、私はリスト全体を実行する必要がありますが、私が32しかなければリストの残りをオプションにしたいと思います。私は44列を持っている場合にのみ、私はそれらを使用することができる方法私のリストでこれらの追加の列をオプションにすることができます場合、私は思ったんだけどregexを特定の位置でオプションにする方法は?

<cfset myRegex = "^[A-Za-z '-]{1,20}\t[A-Za-z '-]{1,20}\t(0?[1-9]|1[0-2])\/(0?[1-9]|1\d|2\d|3[01])\/(19|20)\d{2}\t([M|F])\t(0?[0-9]|1[0-2]|PK)\t[A-Za-z0-9 ]{0,50}\t[A-Za-z0-9 ]{0,50}\t\d{10}(\t[^\t]*){22}\t([0-9]{4})\t([^\t]*)\t([A-Za-z '-]{1,20}|NULL)\t([A-Za-z '-]{1,20}|NULL)\t([A-Za-z0-9 '-.;]{1,100}|NULL)\t([A-Za-z '-]{1,50}|NULL)\t(\b([A-Z]{2})\b|NULL)\t(\b\d{5}(-\d{4})?\b|NULL)\t(\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})|NULL)\t(\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})|NULL)\t(\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})|NULL)\t(\d+|NULL)\t([A-Za-z '-]{1,50}|NULL)\t((([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9][email protected]((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6}|NULL)\r?$"> 

:ここに私の正規表現です。私はそれぞれのオプションの列の後に?を入れようとしましたが、それは動作しませんでした、私の正規表現はその場合にfalseを出力していました。ここで

は(の\ t)は、オプションの列と正規表現を更新されます

<cfset fileRegex = "^[A-Za-z '-]{1,20}\t[A-Za-z '-]{1,20}\t(0?[1-9]|1[0-2])\/(0?[1-9]|1\d|2\d|3[01])\/(19|20)\d{2}\t([M|F])\t(0?[0-9]|1[0-2]|PK)\t[A-Za-z0-9 ]{0,50}\t[A-Za-z0-9 ]{0,50}\t\d{10}(\t[^\t]*){22}\t([0-9]{4})\t(([^\t]*)\t)?(([A-Za-z '-]{1,20}|NULL)\t)?(([A-Za-z '-]{1,20}|NULL)\t)?(([A-Za-z0-9 '-.;]{1,100}|NULL)\t)?(([A-Za-z '-]{1,50}|NULL)\t)?((\b([A-Z]{2})\b|NULL)\t(\b\d{5}(-\d{4})?\b|NULL)\t)?((\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})|NULL)\t)?((\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})|NULL)\t)?((\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})|NULL)\t)?((\d+|NULL)\t)?(([A-Za-z '-]{1,50}|NULL)\t)?(((([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9][email protected]((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6}|NULL))?\r?$"> 

これは同様に動作しませんでした。データと

例:

<cfset myData = "Ruiz John 09/01/1984 M 00 Red Star player 3345678879 0 0 0 0 0 1     0 0 0  0 0 0 0 0  19234 1011 0089 01"> 

<cfif REFind(fileRegex,myData,true) GT 0> 
    true<br> 
<cfelse> 
    false<br> 
</cfif> 
+0

あなたの正規表現には24個の\ tが含まれています。実際には、必要なものが明確ではなく、パターンが長すぎるため、サンプル文字列がなければデバッグできません。 –

+0

@WiktorStribiżewもしあなたが7th \ tの後によく見れば、内部に\ tを含まない22個のカラムを表す(\ t [^ \ t] *){22}があります。私はそれらのフィールドで厳密な検証を使用しませんでした。彼らはタブを持っていないことを確認するだけです。 –

+1

[here](https://regex101.com/r/FJVdso/1)の式を試してください。私はあなたの正規表現がほぼ正しいと仮定します(実際には、正しくデバッグする方法を知ることはできませんが、誰もできません)。私は '\ t'が必須のグループに配置された場所を見つけました。 (おそらく、私はすべての必要なデータを持っていません)。 –

答えて

2

あなたの固定された正規表現は

^[A-Za-z '-]{1,20}\t[A-Za-z '-]{1,20}\t(0?[1-9]|1[0-2])\/(0?[1-9]|1\d|2\d|3[01])\/(19|20)\d{2}\t([M|F])\t(0?[0-9]|1[0-2]|PK)\t[A-Za-z0-9 ]{0,50}\t[A-Za-z0-9 ]{0,50}\t\d{10}(\t[^\t]*){22}\t([0-9]{4})\t[^\t]*(\t([A-Za-z '-]{1,20}|NULL)\t)?(([A-Za-z '-]{1,20}|NULL)\t)?(([A-Za-z0-9 '-.;]{1,100}|NULL)\t)?(([A-Za-z '-]{1,50}|NULL)\t)?((\b([A-Z]{2})\b|NULL)\t(\b\d{5}(-\d{4})?\b|NULL)\t)?((\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})|NULL)\t)?((\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})|NULL)\t)?((\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})|NULL)\t)?((\d+|NULL)\t)?(([A-Za-z '-]{1,50}|NULL)\t)?(((([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9][email protected]((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6}|NULL))?\r?$ 

regex demo is hereです。

(([^\t]*)\t)?から(([A-Za-z '-]{1,20}|NULL)\t)?(=>(\t([A-Za-z '-]{1,20}|NULL)\t)?)のオプショングループに移動する必要があるのは、\tです。

0

はカッコ()でオプションの列の正規表現(と1の\ t)をラップし、その後に追加しますか?最後に

+0

(1件\ t)?各列/正規表現の後に\ tを含める必要がありますか? –

+0

はい、正規表現の部分をオプションにすると2つのタブ(\ t)になります。 – Paul0PT

+0

質問が更新されました。私はそれを試みたが、うまくいかなかった。たぶん私のコードで何かが間違っています。 –

関連する問題