首页 > 解决方案 > vfox pro 表达式检查字符串是否存在

问题描述

我有以下表达

IIF(LABELS.NAME==PARTS.ANAME,IIF(!EMPTY(PARTS.BNAME),"B NAME IS:"+PARTS.BNAME,""),"A NAME IS :" +PARTS.ANAME)

表达式检查两个字段是否匹配单词,例如 field LABELS.NAME: hello field PARTS.BNAME: hello fieldPARTS.ANAME: value

如果找到匹配项,它将打印else"B Name IS: " +的值,BNAME它将打印 中的任何值ANAME

我正在尝试做一些事情,以便它仍然会找到匹配项,如果 1- 单词 hello 在BNAME但大写或混合大小写,并且如果旁边有另一个单词或更多单词,例如

field LABELS.NAME: hello world! fieldPARTS.BNAME: hello 那么这是一场比赛!

反之亦然字段LABELS.NAME: hello 字段PARTS.BNAME: hello world

标签: visual-foxpro

解决方案


你的问题不是很清楚。您可能无法使用 $ 等运算符以及 trim()、upper() 等函数来解决此问题。但它可能是这样,您可能无法清楚地解释它。例如,如果 BName 是“Chello”并且标签有“Hello”或“Hello World”,它是否与 BName 匹配?我以为不是。“Hello”是匹配的,但“Chello”不是,对吧?不幸的是,您没有提供任何示例数据。

该解决方案听起来很可怕,使用 VFP 并且非常慢。希望您的零件和标签数据中没有太多数据,可以使用 xbase + alines 或使用正则表达式来解决。

虽然这看起来很丑而且会很慢,但我认为数据的原始设计很丑。

Create Cursor labels (Name c(20))
Insert Into labels Values ("hello WORLD!")
Insert Into labels Values ("HellO")
Insert Into labels Values ("way")

Create Cursor parts (Id i Autoinc, aname c(20), bname c(20))
Insert Into parts (aname, bname) Values ("aname value1","hello")
Insert Into parts (aname, bname) Values ("aname value2","hello world")
Insert Into parts (aname, bname) Values ("aname value3","HeLlo world")
Insert Into parts (aname, bname) Values ("aname value4","Hello World")
Insert Into parts (aname, bname) Values ("aname value5","Hello There")
Insert Into parts (aname, bname) Values ("aname value6","My World")
Insert Into parts (aname, bname) Values ("aname value7","World Fair")
Insert Into parts (aname, bname) Values ("aname value8","Two way")
Insert Into parts (aname, bname) Values ("aname value9","Chello")
Insert Into parts (aname, bname) Values ("aname value10","worlds")



Local oRegEx
oRegEx = Createobject("VBScript.RegExp")
oRegEx.IgnoreCase = .T.
oRegEx.Global = .T.

Select p.ID, p.AName, p.BName, ;
Cast(Iif(IsNull(tmp.Id), 'AName is:' + AName, 'BName is:' + BName) as c(30)) dummy ;
from parts p ;
left join ;
 (Select distinct p2.ID from parts p2 ;
    inner join labels lb ;
    on IsSpecialMatch(m.oRegEx, p2.bname, lb.Name)) tmp ;
    on tmp.Id = p.Id

Procedure IsSpecialMatch(toRX, tcValue1, tcValue2)
    Local IsMatch
    toRX.Pattern = '\b'+Trim(m.tcValue1)+'\b'
    IsMatch = toRX.Test( m.tcValue2 )
    If !IsMatch
        toRX.Pattern = '\b'+Trim(m.tcValue2)+'\b'
        IsMatch = toRX.Test( m.tcValue1 )
    Endif
    Return m.IsMatch
Endproc

推荐阅读