首页 > 解决方案 > 在文本文档中查找配对值的最有效方法是什么

问题描述

给定以下文本:

<Cfsavecontent variable="testString">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum</Cfsavecontent>

并给出以下数组:

<Cfset pairs = [['ipsum','/bla'],['nisi','/alb']]>

如何替换第一个数组项并将它们替换为文本中的第二个数组项。

输出应该是:Lorem /bla dolor sit amet,consectetur adipiscing elit,sed do eiusmod tempor incididunt ut labore et dolore magna aliqua。Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris /alb ut aliquip ex ea commodo consequat。Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur。Exceptioneur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est labourum

我可以做一个简单的 cfloop 并一个一个地搜索数组项,但这不是很有效。有没有更好的方法来处理这个问题。

这是一个非常简单的例子。实际数组将包含 500 多个关键字,需要在大约 20.000 多个文本文档中进行搜索和替换。

标签: coldfusion

解决方案


替换还不错,因为您还可以轻松匹配子字符串。如果您只需要替换由空格包围的单词,请考虑迭代每个单词并匹配要替换的对的哈希映射。

<cfsavecontent variable="testString">
    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum
</cfsavecontent>

<!--- case insensitive: use a case ignoring ColdFusion struct --->
<cfset pairs = {
    "ipsum": "/bla",
    "nisi":  "/alb"
}>

<!--- case sensitive: use a case aware Java HashMap --->
<!---
    <cfset pairs = createObject("java", "java.util.HashMap").init()>
    <cfset pairs.put("ipsum", "/bla")>
    <cfset pairs.put("nisi",  "/alb")>
--->

<cfset words     = listToArray(testString, " ")>
<cfset wordCount = arrayLen(words)>

<cfloop from="1" to="#wordCount#" index="i">
    <cfif structKeyExists(pairs, words[i])>
        <cfset words[i] = pairs[ words[i] ]>
    </cfif>
</cfloop>

<cfset replacedTestString = arrayToList(words, " ")>

<cfoutput>#replacedTestString#</cfoutput>

推荐阅读