| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 411 人关注过本帖
标题:挑战DeepSeek!感觉上,TA写VFP代码没太大问题啊。
只看楼主 加入收藏
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:368
专家分:335
注 册:2013-10-4
结帖率:100%
收藏
 问题点数:0 回复次数:10 
挑战DeepSeek!感觉上,TA写VFP代码没太大问题啊。
提问:
StrExtract(x,"<",">")可以提取两个分隔符之间的字符串,请实现函数StrDelExtract(x,"<",">"),用途是删除两个分隔符之间的字符串(类似于批量删除<XML>标签一类操作)。

回答:
FUNCTION StrDelExtract(cString, cBeginDelim, cEndDelim)
    LOCAL nStartPos, nEndPos, cResult, i, nOccurrence
   
    * 参数检查
    IF VARTYPE(cString) <> "C" OR EMPTY(cString)
        RETURN ""
    ENDIF
    IF VARTYPE(cBeginDelim) <> "C" OR EMPTY(cBeginDelim)
        RETURN cString
    ENDIF
    IF VARTYPE(cEndDelim) <> "C" OR EMPTY(cEndDelim)
        RETURN cString
    ENDIF
    nOccurrence = OCCURS(cBeginDelim, cString)  && 统计匹配数目
    IF nOccurrence = 0
        RETURN cString
    ENDIF
   
    * 初始化
    cResult = cString
   
    * 循环处理所有匹配项
    for i = 1 to nOccurrence
        nStartPos = AT(cBeginDelim, cResult)
        nEndPos = AT(cEndDelim, cResult)
        IF nEndPos = 0
            EXIT
        ENDIF
        * 删除匹配部分
        cResult = STUFF(cResult, nStartPos, nEndPos - nStartPos + LEN(cEndDelim), "")      
    ENDFOR i
   
    RETURN cResult
ENDFUNC

*---------------*
DeepSeek的原始代码用Do...while,随手改为For...Endfor,TA写的这段VFP代码,似乎也没啥好再优化的了。
前天 12:51
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:368
专家分:335
注 册:2013-10-4
收藏
得分:0 
当然,有些容错,TA还是写漏了,比如:
假设我故意将分隔符写成>xxx<,又或者,写成<<xxx>>,又或者……AI毕竟斗不过险恶的人心哪。嘿嘿。


前天 14:18
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:火星
等 级:版主
威 望:37
帖 子:774
专家分:3010
注 册:2018-3-13
收藏
得分:0 
能写成这样已经算不错了
不一定要故意写错,像这样一段简单且合法的 xml 就被忽略了
程序代码:
<?xml version="1.0" encoding="gbk"?>
<xml>
    <text>普通文本行</text>
    <numeric>12345</numeric>
    <html><![CDATA[<p>HTML文本</p>]]></html>
</xml>


这家伙很懒,啥也没留下
前天 14:47
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:368
专家分:335
注 册:2013-10-4
收藏
得分:0 
TA还提供了更简洁的正则表达式(复杂匹配):

* 需引用 VBScript.RegExp
oRegEx = CREATEOBJECT("VBScript.RegExp")
oRegEx.Pattern = "\<.*?\>"  && 非贪婪匹配<...>
oRegEx.Global = .T.
cResult = oRegEx.Replace(cString, "")
……

只是,在我心目中,这样一个函数可能会这么用:

replace all content with StrDelExtract(content,"<",">")

在成千上万行记录中,创建成千上万次对象"VBScript.RegExp",然后再成千上万次销毁,感觉上总有些莫名的奢侈。
摇摇头心想还是算了罢。


前天 15:08
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:火星
等 级:版主
威 望:37
帖 子:774
专家分:3010
注 册:2018-3-13
收藏
得分:0 
以下是引用cssnet在2025-4-13 15:08:37的发言:
TA还提供了更简洁的正则表达式(复杂匹配):
。。。
在成千上万行记录中,创建成千上万次对象"VBScript.RegExp",然后再成千上万次销毁,感觉上总有些莫名的奢侈。
摇摇头心想还是算了罢。

你就不能把函数改下?先创建并设置好 oRegEx,然后作为参数传给 StrDelExtract
再或者,创建一个 goRegEx,省得还要传入

[此贴子已经被作者于2025-4-13 15:41编辑过]


这家伙很懒,啥也没留下
前天 15:40
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:368
专家分:335
注 册:2013-10-4
收藏
得分:0 
以下是引用csyx在2025-4-13 15:40:12的发言:
你就不能把函数改下?先创建并设置好 oRegEx,然后作为参数传给 StrDelExtract
再或者,创建一个 goRegEx,省得还要传入


这……这……这,假假地,这也算一个通用函数吧?要求调用者事先创建一个oRegEx,然后再调用,万一不留神,忘了这茬咧?这“复用性”……未免也太过强人所难了吧?
前天 17:43
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:881
专家分:1364
注 册:2021-10-13
收藏
得分:0 
回复 楼主 cssnet
都已经用strextract,取出那个内容了,删除还需要那么麻烦吗?
直接用strtran就可以了!
STRTRAN(cSearched, cExpressionSought [, cReplacement][, nStartOccurrence] [, nNumberOfOccurrences] [, nFlags])
程序代码:
parameters corgstr,cBeginDelim, cEndDelim
cdelstr=strexact(corgstr,cBeginDelim, cEndDelim)
if #empty(cdelstr)
    corgstr=strtran(corgstr,cdelstr,"")
    *如果需要把2个定位字符串也删除的话,可以改成如下
    *corgstr=strtran(corgstr,cBeginDelim+cdelstr+cEndDelim,"")
endif 
return corgstr


如果有多个符合条件的,就设置一个do while循环操作就可以了。do while 通常用于不知道循环次数的操作,而for循环是用于知道确定循环次数的操作。。。
前天 17:51
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:火星
等 级:版主
威 望:37
帖 子:774
专家分:3010
注 册:2018-3-13
收藏
得分:0 
以下是引用cssnet在2025-4-13 17:43:33的发言:
这也算一个通用函数吧?要求调用者事先创建一个oRegEx,然后再调用,万一不留神,忘了这茬咧?这“复用性”……未免也太过强人所难了吧?

为了执行效率牺牲一点通用性也算是一种妥协吧,你要是觉得这种强耦合不太优雅,另写一个 GetRegExObject() 也可以啊,如果 goRegEx 存在就直接返回它,否则就用 NewObject 新建一个 goRegEx 并返回也未尝不可

这家伙很懒,啥也没留下
前天 20:49
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:368
专家分:335
注 册:2013-10-4
收藏
得分:0 
参照DeepSeek的回答,我也挖空心思实现了另一个版本,只可惜忘了妥善处理分隔符嵌套的情形

FUNCTION StrExcise(cString, cBeginDelim, cEndDelim)
    LOCAL nStartPos, nEndPos, cResult, i, nOccurrence
   
    * 参数检查
    IF VARTYPE(cString) <> "C" OR EMPTY(cString)
        RETURN ""
    ENDIF
    IF VARTYPE(cBeginDelim) <> "C" OR EMPTY(cBeginDelim)
        RETURN cString
    ENDIF
    IF VARTYPE(cEndDelim) <> "C" OR EMPTY(cEndDelim)
        RETURN cString
    ENDIF
    nOccurrence = OCCURS(cBeginDelim, cString)  && 统计匹配数目
    IF nOccurrence = 0
        RETURN cString
    ENDIF
   
    * 分割源字符串
    nLines = alines(a_lines, cString, 16, cBeginDelim, cEndDelim, 0h0D0A)
    * 初始化
    cResult = ""

    * 循环处理所有匹配项
    for i=1 to nLines
        nStartPos = AT(cBeginDelim, a_lines[i])
        nEndPos = AT(cEndDelim, a_lines[i])
    Do case
        case nStartPos > 0
           cResult = cResult + left(a_lines[i], nStartPos-1)
        case nEndPos > 0
        otherwise
           cResult = cResult + a_lines[i] + 0h0D0A
        Endcase
    ENDFOR i
   
    RETURN cResult
ENDFUNC

前天 21:55
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:368
专家分:335
注 册:2013-10-4
收藏
得分:0 
第二个问题受7#启发,相对简单些:
函数strTran(x,"<",">")可以批量删除或替换字符表达式或备注字段中的关键字,请实现函数LineTran(),用途是,将字符表达式或备注字段中含有关键字的一整行,批量替换或删除。

回答:
FUNCTION LineTran(cMemoText, cKeyLine, cReplaceTo)
    LOCAL cResult, nLineCount, i, cLine
   
    * 参数检查
    IF VARTYPE(cMemoText) <> "C" OR EMPTY(cMemoText)
        RETURN ""
    ENDIF
    IF VARTYPE(cKeyLine) <> "C" OR EMPTY(cKeyLine)
        RETURN cMemoText
    ENDIF
    IF VARTYPE(cReplaceTo) <> "C"
        cReplaceTo = ""
    ENDIF
   
    * 按行处理
    cResult = ""
    nLineCount = ALINES(a_Lines, cMemoText)
   
    FOR i = 1 TO nLineCount
        cLine = a_Lines[i]
        * 判断是否包含关键字(区分大小写)
        IF at(cKeyLine, cLine) > 0
        if ! empty(cReplaceTo)
        cResult = cResult + cReplaceTo + IIF(i < nLineCount, CHR(13) + CHR(10), "")
        endif
        ELSE
            cResult = cResult + cLine + IIF(i < nLineCount, CHR(13) + CHR(10), "")
        ENDIF
    ENDFOR
   
    RETURN cResult
ENDFUNC

*---------------*
注:同上,DeepSeek的原始代码用Do...while,随手改为For...Endfor。
昨天 10:42
快速回复:挑战DeepSeek!感觉上,TA写VFP代码没太大问题啊。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020865 second(s), 10 queries.
Copyright©2004-2025, BC-CN.NET, All Rights Reserved