2016-11-15 9 views
1

こんにちは皆私はJavaScriptで作成した正規表現を持っていますが、今はそれらをColdFusionに入れたいと思います。これをColdFusionに入れようとしているときに実行したいくつかの問題は、最初は空白の値であった。私の変数が空の場合、私の正規表現はfalseを出力していました。 2番目の問題は、私のテキストファイルの行全体をチェックする1つの大きな行にこれらの正規表現を組み合わせています。何らかの理由で私の正規表現は大文字小文字を無視していました。私が小文字だけを持っていれば、私の正規表現はこの場合でも許されないとしても真実を出力していました。私のデータセットでこの場合の最後の言葉でそう正規表現をJavaScriptからColdFusionに変換しますか?

<cfset fileRegex = "^(?i)^ *[a-z][a-z' .,-]{0,49} *\t(?i) *[a-z][a-z' .,-]{0,49} *\t *(0?[1-9]|1[0-2])\/(0?[1-9]|1\d|2\d|3[01])\/(19|20)\d{2} *\t(?i) *([M|F]) *\t(?i) *(0?[0-9]|1[0-2]|[A-Z]{1,2}) *\t *([^\t].{0,50}) *\t(?i) *([A-Z0-9 ,]{1,102})? *\t *\d{10} *(\t[^\t]*){22}\t *([0-9]{1,4}) *\t([^\t]*)(\t *[A-Z ',.-]{1,50} *)?$"> 

<cfset myData = "John Terry 1/29/1981 M 0 London NULL 0129198109 609 8000 1 England"> 

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

Englandされ、私の正規表現は大文字を受け入れなければならないと私はFalseを取得しますこのフィールドを空のままにした場合には、第二の問題はありません。ここに私の正規表現がありますその代償としてまた、この最後の言葉はオプションです。私がタブと一緒にそれを消去すると、私はtrueを得なければなりません。誰かがこの問題を助けることができるなら私に知らせてください。

+0

[あなたの正規表現は文字列と一致しません](https://regex101.com/r/RchZSn/1) '(\ t [^ \ t] *){22}'は22個のカラム。それを '(\ t [^ \ t] *){0,22} 'と置き換えるとうまくいきます。 [このデモ](https://regex101.com/r/RchZSn/3)を参照してください。 –

+0

@WiktorStribiżewそれは私の22の列を任意にするでしょうか? –

+0

はい、そうです。 '(?i)'がたくさんあることに注意してください。これは必須ではありません。パターンの先頭にある1つの '(?i)'で十分です。また、 '[M | F]'の中の '|'は、リテラルパイプシンボルとして解析されるので、取り除かなければなりません。 –

答えて

2

正規表現には22列、(\t[^\t]*){22}が必要です。

(?i)^ *[a-z][a-z' .,-]{0,49} *\t *[a-z][a-z' .,-]{0,49} *\t *(0?[1-9]|1[0-2])\/(0?[1-9]|1\d|2\d|3[01])\/(19|20)\d{2} *\t *([MF]) *\t *(0?[0-9]|1[0-2]|[A-Z]{1,2}) *\t *([^\t].{0,50}) *\t *([A-Z0-9 ,]{1,102})? *\t *\d{10} *(\t[^\t]*){0,22}\t *([0-9]{1,4}) *\t([^\t]*)(\t *[A-Z ',.-]{1,50} *)?$ 

regex demo

いくつかの小さな機能強化を参照してください:

  • はつまり、あなたが内部の多くの(?i)を持っています - (>(\t[^\t]*){0,22})と正規表現は基本的に動作しますあなたはそれらをオプションにあり必要はありません。パターンの先頭にある単一の(?i)で十分です。
  • | inside [M|F]は、リテラルパイプシンボルとして解析されるため、削除する必要があります。 [M|F]は、M,|、またはFのいずれかの文字の1つに一致します。
  • 実際に/をエスケープする必要があるかどうかを確認してください。正規表現の区切り文字がないので、エスケープする必要があります。
+0

MとFの間のパイプを削除すると、正規表現の2つの文字をどうやってチェックするのですか? /私はフォワードスラッシュを確認する必要がありますまた/? –

+1

'[...]'は文字クラスであり、グループ化構文ではありません。 '[ab]' = '(?:a | b)'です。スラッシュは '\ /'のすべての場合を意味していました。 JSとは異なり、ColdFusion正規表現では特殊文字ではないため、スラッシュをエスケープする必要はありません。 –