それぞれの括弧 (param \d+) の間の内容を確実に取得できる正規表現 (Coldfusion または Java) を探しています。数十種類の正規表現を試しましたが、最も近いものは次のとおりです。
\(param \d+\) = \[(type='[^']*', class='[^']*', value='(?:[^']|'')*', sqltype='[^']*')\]
CF から返された文字列が値パラメーターから一重引用符をエスケープした場合、これは完璧です。しかし、そうではないので、惨めに失敗します。次のような否定的な先読みのルートに進みます。
\[(type='[^']*', class='[^']*', value='(?:(?!', sqltype).)*', sqltype='[^']*')\]
なんらかの不自然な理由で、文字通り, sqltype
値に含まれるコードが存在しない限り、それは素晴らしいことです。見つかったすべての開き括弧と閉じ括弧の内容をすくい取るように正規表現に単純に指示できないとは信じがたいですが、繰り返しになりますが、その限界を知るのに十分な正規表現を知りません。
解析しようとしている文字列の例を次に示します。
(param 1) = [type='IN', class='java.lang.Integer', value='47', sqltype='cf_sql_integer'] , (param 2) = [type='IN', class='java.lang.String', value='asf , O'Reilly, really?', sqltype='cf_sql_varchar'] , (param 3) = [type='IN', class='java.lang.String', value='Th[is]is Ev'ery'thing That , []can break it ', sqltype= ', sqltype='cf_sql_varchar']
好奇心旺盛な人のために、これはCopyable Coldfusion SQL Exceptionのサブ質問です。
編集
これは、CF9.1 で @Mena の回答を実装しようとする私の試みです。悲しいことに、文字列の処理が完了していません。\\
最初に実行するためだけにを置き換える必要がありまし\
たが、実装にまだ問題がある可能性があります。
これは与えられた文字列です (パイプは単に境界を示すためのものです):
| (param 1) = [type='IN', class='java.lang.Integer', value='47', sqltype='cf_sql_integer'] , (param 2) = [type='IN', class='java.lang.String', value='asf , O'Reilly], really?', sqltype='cf_sql_varchar'] , (param 3) = [type='IN', class='java.lang.String', value='Th[is]is Ev'ery'thing That , []can break it ', sqltype ', sqltype='cf_sql_varchar'] |
これは私の実装です:
<cfset var outerPat = createObject("java","java.util.regex.Pattern").compile(javaCast("string", "\((.+?)\)\s?\=\s?\[(.+?)\](\s?,|$)"))>
<cfset var innerPat = createObject("java","java.util.regex.Pattern").compile(javaCast("string", "(.+?)\s?\=\s?'(.+?)'\s?,\s?"))>
<cfset var outerMatcher = outerPat.matcher(javaCast("string", arguments.params))>
<cfdump var="Start"><br />
<cfloop condition="outerMatcher.find()">
<cfdump var="#outerMatcher.group(1)#"> (<cfdump var="#outerMatcher.group(2)#">)<br />
<cfset var innerMatcher = innerPat.matcher(javaCast("string", outerMatcher.group(2)))>
<cfloop condition="innerMatcher.find()">
<cfoutput>|__</cfoutput><cfdump var="#innerMatcher.group(1)#"> --> <cfdump var="#innerMatcher.group(2)#"><br />
</cfloop>
<br />
</cfloop>
<cfabort>
そして、これが印刷されたものです:
Start
param 1 ( type='IN', class='java.lang.Integer', value='47', sqltype='cf_sql_integer' )
|__ type --> IN
|__ class --> java.lang.Integer
|__ value --> 47
param 2 ( type='IN', class='java.lang.String', value='asf , O'Reilly )
|__ type --> IN
|__ class --> java.lang.String
End