visual-foxpro - 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
解决方案
你的问题不是很清楚。您可能无法使用 $ 等运算符以及 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
推荐阅读
- c# - 样式 System.Windows.Controls.ComboBox 不显示 selectedItem
- wso2 - 是否有任何机制可以从代码中从 WSO2 Esb 中的用户存储中获取 userProfile 信息?
- python - 当用户调整 GUI 的大小时,有没有办法改变 GUI 内容的大小?
- json - jq:如何在其他字段中使用相同的搜索而不重复代码?
- azure - 是否有任何 Poweshell 脚本或 az 命令来获取产品列表及其 API 管理的订阅 ID?
- c# - Telerik 多图 MVC(堆叠条形图?)
- python - 命题和时间逻辑表达式的前缀/波兰符号?
- google-bigquery - Google BigQuery 从具有 regexp_extract 的列中提取字符串 - 字符串值
- android - 如何使 Android textview 可选择并滚动到底部(默认情况下)?
- reactjs - 无法在 Bit.dev 上解析“react/jsx-runtime”