获取带有 listGetAt 分隔符的字符串
Get string with listGetAt delimiter
我有这个字符串supplier_id ~|(~ '3422' ~)|~supplier_name ~|(~ 'WD Ltd.' ~)|~project_personnel ~|(~ 'Yaya Toure (temp)' ~)|~lt_project_code ~|(~ '013-7718321' ~)|~ id ~|(~ '668'
我需要在 ~|(~data~)|~
中获取内容。我使用 listGetAt
和分隔符。问题是定界符内的某些数据包含括号 (
,这会破坏搜索。例如 Yaya Toure (temp)
包含方括号。
<cfoutput>
<cfset test = "supplier_id ~|(~ '3422' ~)|~supplier_name ~|(~ 'WD Ltd.' ~)|~project_personnel ~|(~ 'Yaya Toure (temp)' ~)|~lt_project_code ~|(~ '013-7718321' ~)|~ id ~|(~ '668'">
#test#
<cfset count_column = ListLen(test, "~)|~")>
<cfset column_name = ''>
<cfloop index="i" from="1" to=8 >
<cfif i mod 2 EQ 0>
<cfset column_name = ListAppend(column_name,listGetAt(test, i, "~|(~~)|~" ),",")>
</cfif>
</cfloop>
<br>
<br>
Result : #column_name#
</cfoutput>
输出:Result : '3422' , 'WD Ltd.' , 'Yaya Toure ,'
我的预期结果是:'3422' , 'WD Ltd.' , 'Yaya Toure (temp)' , '013-7718321'
。如果我从字符串中删除 (temp)
,它将起作用。请协助我,提前致谢。
方案一:使用支持多字符分隔符的CF列表函数,如listToArray.
<cfscript>
// split on first delimiter get "name->value" string
nameValuePairs = test.listToArray("~)|~" , false, true);
columnValues = [];
nameValuePairs.each(function(pair, index) {
// split on second delimiter to extract value
local.data = pair.listToArray("~|(~", false, true);
columnValues.append( local.data[ 2 ] );
});
writeDump( "Result 1: "& columnValues.toList() );
</cfscript>
选项 2: 如果您可以识别出值中从未出现的单个字符,可能是不可打印的字符,只需替换现有的分隔符,然后像往常一样循环。
<cfscript>
// 31 == Unit separator
delim = chr(31);
newString = test.replace( "~)|~", delim, "all")
.replace( "~|(~", delim, "all");
columnValues = [];
newString.listToArray( delim ).each(function( elem, index) {
if (index mod 2 == 0) {
columnValues.append( elem );
}
});
WriteOutput( "<br>Result 2: "& columnValues.toList() );
</cfscript>
更新
problem though for this string supp~|(~lier_isd ~|(~ '3422' ~)|~supplier_name ~|(~ 'WD Ltd.' ~)|~project_personnel ~|(~ 'Yaya Toure (temp)' ~)|~lt_project_code ~|(~ '013-7718321' ~)|~ id ~|(~ '668'
I was expecting lier_isd ~|(~ '3422', 'WD Ltd.', 'Yaya Toure (temp)', '013-7718321'
初始字符串似乎使用 name ~|(~ value ~)|~
格式。但是,如果 value 本身可以包含列表定界符之一 ~|(~
,您将无法使用列表函数,因为该函数无法区分何时 ~|(~
充当分隔符,当它是值的一部分时。您需要改用正则表达式。那不是我的强项,但像这样的东西应该有用
values = [];
// Find groups of "~|(~ value ~)|~"
matches = reMatch( "~\|\(~(.+?)(?=~\)\|~)", test);
matches.each( function(item, index) {
// remove text up to and including the first "~|(~"
local.str = reReplace( item, ".*?~\|\(~", "");
values.append( local.str );
});
WriteOutput( "Result 1: "& values.toList() );
说明
~ Find tilde "~"
\| Find pipe "|"
\( Find open parenthesis "("
~ Find tilde "~"
(.+?) One ore more characters, non-greedy
(?= Followed by (Non-capturing lookahead)
~ tilde "~"
\) close parenthesis "("
\| pipe "|"
~ tilde "~"
) End lookahead
.*? Zero or more characters
~ Find tilde "~"
\| Find pipe "|"
\( Find open parenthesis "("
~ Find tilde "~"
我有这个字符串supplier_id ~|(~ '3422' ~)|~supplier_name ~|(~ 'WD Ltd.' ~)|~project_personnel ~|(~ 'Yaya Toure (temp)' ~)|~lt_project_code ~|(~ '013-7718321' ~)|~ id ~|(~ '668'
我需要在 ~|(~data~)|~
中获取内容。我使用 listGetAt
和分隔符。问题是定界符内的某些数据包含括号 (
,这会破坏搜索。例如 Yaya Toure (temp)
包含方括号。
<cfoutput>
<cfset test = "supplier_id ~|(~ '3422' ~)|~supplier_name ~|(~ 'WD Ltd.' ~)|~project_personnel ~|(~ 'Yaya Toure (temp)' ~)|~lt_project_code ~|(~ '013-7718321' ~)|~ id ~|(~ '668'">
#test#
<cfset count_column = ListLen(test, "~)|~")>
<cfset column_name = ''>
<cfloop index="i" from="1" to=8 >
<cfif i mod 2 EQ 0>
<cfset column_name = ListAppend(column_name,listGetAt(test, i, "~|(~~)|~" ),",")>
</cfif>
</cfloop>
<br>
<br>
Result : #column_name#
</cfoutput>
输出:Result : '3422' , 'WD Ltd.' , 'Yaya Toure ,'
我的预期结果是:'3422' , 'WD Ltd.' , 'Yaya Toure (temp)' , '013-7718321'
。如果我从字符串中删除 (temp)
,它将起作用。请协助我,提前致谢。
方案一:使用支持多字符分隔符的CF列表函数,如listToArray.
<cfscript>
// split on first delimiter get "name->value" string
nameValuePairs = test.listToArray("~)|~" , false, true);
columnValues = [];
nameValuePairs.each(function(pair, index) {
// split on second delimiter to extract value
local.data = pair.listToArray("~|(~", false, true);
columnValues.append( local.data[ 2 ] );
});
writeDump( "Result 1: "& columnValues.toList() );
</cfscript>
选项 2: 如果您可以识别出值中从未出现的单个字符,可能是不可打印的字符,只需替换现有的分隔符,然后像往常一样循环。
<cfscript>
// 31 == Unit separator
delim = chr(31);
newString = test.replace( "~)|~", delim, "all")
.replace( "~|(~", delim, "all");
columnValues = [];
newString.listToArray( delim ).each(function( elem, index) {
if (index mod 2 == 0) {
columnValues.append( elem );
}
});
WriteOutput( "<br>Result 2: "& columnValues.toList() );
</cfscript>
更新
problem though for this string
supp~|(~lier_isd ~|(~ '3422' ~)|~supplier_name ~|(~ 'WD Ltd.' ~)|~project_personnel ~|(~ 'Yaya Toure (temp)' ~)|~lt_project_code ~|(~ '013-7718321' ~)|~ id ~|(~ '668'
I was expectinglier_isd ~|(~ '3422', 'WD Ltd.', 'Yaya Toure (temp)', '013-7718321'
初始字符串似乎使用 name ~|(~ value ~)|~
格式。但是,如果 value 本身可以包含列表定界符之一 ~|(~
,您将无法使用列表函数,因为该函数无法区分何时 ~|(~
充当分隔符,当它是值的一部分时。您需要改用正则表达式。那不是我的强项,但像这样的东西应该有用
values = [];
// Find groups of "~|(~ value ~)|~"
matches = reMatch( "~\|\(~(.+?)(?=~\)\|~)", test);
matches.each( function(item, index) {
// remove text up to and including the first "~|(~"
local.str = reReplace( item, ".*?~\|\(~", "");
values.append( local.str );
});
WriteOutput( "Result 1: "& values.toList() );
说明
~ Find tilde "~"
\| Find pipe "|"
\( Find open parenthesis "("
~ Find tilde "~"
(.+?) One ore more characters, non-greedy
(?= Followed by (Non-capturing lookahead)
~ tilde "~"
\) close parenthesis "("
\| pipe "|"
~ tilde "~"
) End lookahead
.*? Zero or more characters
~ Find tilde "~"
\| Find pipe "|"
\( Find open parenthesis "("
~ Find tilde "~"