【问题标题】:vfox pro expression to check string existvfox pro 表达式检查字符串是否存在
【发布时间】:2021-07-16 19:23:01
【问题描述】:

我有下面的表达方式

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

表达式检查两个字段以查找匹配的单词,例如 字段LABELS.NAME: hello 字段PARTS.BNAME: hello 字段PARTS.ANAME: value

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

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

字段LABELS.NAME: hello world! 字段PARTS.BNAME: hello 那就是一场比赛!

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

【问题讨论】:

    标签: visual-foxpro


    【解决方案1】:

    你的表达和解释不清楚也不正确。让我们分解一下你的表达方式:

    IF LABELS.NAME 是 PARTS.ANAME 的 EXACT 匹配:

    • 选择“B NAME IS:”+PARTS.BNAME 或者如果为空白选择“”

    否则:

    • “名称是:”+PARTS.ANAME

    基本上,您是说如果 name 和 aname 匹配,则选择 bname。

    至于你的解释,不清楚你是只检查一个单词匹配,还是每个单词匹配?

    尝试运行它,看看它是否更符合您的要求:

    CLEAR 
    CREATE CURSOR labels (name c(20))
    INSERT INTO labels VALUES ("hello WORLD!")
    INSERT INTO labels VALUES ("hello")
    
    CREATE CURSOR parts (aname c(20), bname c(20))
    INSERT INTO parts VALUES ("aname value","hello")
    INSERT INTO parts VALUES ("aname value2","hello world")
    GOTO TOP IN labels
    GOTO TOP IN parts
    
    =domatch()
    SKIP IN parts
    =domatch()
    SKIP IN labels
    SKIP -1 IN parts
    =domatch()
    SKIP IN parts
    =domatch()
    
    FUNCTION domatch()
    ? "LABELS Record " + TRANSFORM(RECNO("labels")) + "  " + "PARTS Record " + TRANSFORM(RECNO("parts"))
    ? "LABELS.Name:" + labels.name
    ? "PARTS.Aname:" + parts.aname
    ? "PARTS.Bname:" + parts.bname
    ? "---------------------------"
    ? IIF(ALLTRIM(UPPER(labels.name)) $ UPPER(parts.bname),"B NAME IS: " + parts.bname + " (name is contained in labels bname)", "A NAME IS: " + parts.aname+ " (NO match, here's aname value)")
    ? IIF(ALLTRIM(UPPER(parts.bname)) $ UPPER(labels.name),"B NAME IS: " + parts.bname + " (bname is contained in labels name)", "A NAME IS: " + parts.aname+ " (NO match, here's aname value)")
    ?
    

    上面例子的关键是使用:

    • $ 运算符:cSearchFor $ cSearchIn
    • ALLTRIM() : 左右修剪
    • UPPER() : 将两个字符串都转换为大写以进行匹配

    HTH

    【讨论】:

      【解决方案2】:

      你的问题不是很清楚。 您可能无法使用 $ 之类的运算符以及 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
      

      【讨论】:

        猜你喜欢
        • 2012-06-24
        • 1970-01-01
        • 1970-01-01
        • 2023-03-04
        • 2011-02-19
        • 1970-01-01
        • 2016-02-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多