关于字符串为空的判断条件

第一篇随笔,正好今天解决了一个问题,立马记录下,希望是好习惯的开始。

 

问题描述:读取一个记录SQL查询语句的XML文档,生成SQL查询字符串。

XML文档如下所示:

<?xml version="1.0" encoding="utf-8"?>
<SubQuery>
  <DBName>SQLServer</DBName>
  <Select>*</Select>
  <From>t_product</From>
  <Where>ID=1</Where>
  <Order>
  </Order>
  <Group>
  </Group>
</SubQuery

希望得到的字符串结果为:select * from t_product  where ID=1

先贴下我一开始编写的代码:

public string XmlToSQL(XmlDocument doc)
    {
        string str_select, str_from, str_where, str_order, str_group;
        str_select = null;
        str_from = null;
        str_where = null;
        str_order = null;
        str_group = null;
        XmlNode node_select, node_from, node_where, node_order, node_group;
        XmlNode root = doc.DocumentElement;
        node_select = root.SelectSingleNode("Select");
        str_select = node_select.InnerText;
        node_from = root.SelectSingleNode("From");
        str_from = node_from.InnerText;
        node_where = root.SelectSingleNode("Where");
        str_where = node_where.InnerText;
        node_order = root.SelectSingleNode("Order");
        str_order = node_order.InnerText;
        node_group = root.SelectSingleNode("Group");
        str_group = node_group.InnerText;
        string str = "select " + str_select + " from " + str_from;
        if (str_where.Length !=null )
        {
            str += " " + " where " + str_where;
        }
        if (str_order.Length !=null)
        {
            str += " " + " order by "+str_order;
        }
        if (str_group.Length !=null)
        {
            str += " " + " group by " +str_group;
        }
        return str;
    }

运行结果为:select * from t_product  where ID=1  order by   group by 

不是预期结果。

当时思考str_order和str_group两个字符串的结果应该为null,不清楚哪里出错。

然后编写测试程序,测试发现,这两个字符串结果不为null。

字符串为空,但不为null。这个点,我之前一直都是理解错误了。

然后想到通过测试字符串的长度作为判断条件。

于是修改代码如下:

public string XmlToSQL(XmlDocument doc)
    {
        string str_select, str_from, str_where, str_order, str_group;
        str_select = null;
        str_from = null;
        str_where = null;
        str_order = null;
        str_group = null;
        XmlNode node_select, node_from, node_where, node_order, node_group;
        XmlNode root = doc.DocumentElement;
        node_select = root.SelectSingleNode("Select");
        str_select = node_select.InnerText;
        node_from = root.SelectSingleNode("From");
        str_from = node_from.InnerText;
        node_where = root.SelectSingleNode("Where");
        str_where = node_where.InnerText;
        node_order = root.SelectSingleNode("Order");
        str_order = node_order.InnerText;
        node_group = root.SelectSingleNode("Group");
        str_group = node_group.InnerText;
        string str = "select " + str_select + " from " + str_from;
        if (str_where.Length >0 )
        {
            str += " " + " where " + str_where;
        }
        if (str_order.Length > 0)
        {
            str += " " + " order by "+str_order;
        }
        if (str_group.Length > 0)
        {
            str += " " + " group by " +str_group;
        }
        return str;
    }

结果正确。

可以看出,改动幅度很小。

实现了具体目标,但并不清楚自己所用方法是否为最佳。

欢迎讨论。

转载于:https://www.cnblogs.com/trey/p/4682689.html

<think>好的,用户问的是如何在Lua中判断字符串是否为。我需要先回忆一下Lua中字符串的处理方式。Lua里字符串是自动管理的,用双引号或单引号包裹。判断字符串的话,可能直接检查长度是否为0就行。 记得在Lua中,字符串是可以通过长度操作符`#`来获取长度的,比如`#str`。所以如果字符串,那么`#str == 0`应该成立。不过还要考虑用户可能传入的是nil的情况,这时候直接检查长度会出错,所以应该先确保变量是字符串类型,或者先判断是否为nil。比如用`if str == nil or #str == 0 then`这样。 另外,用户可能还会遇到字符串包含格的情况,比如" "这样的,这时候可能需要用`string.match`来检查是否有非白字符。不过用户的问题只是判断,可能不需要处理这种情况,但可能需要提到这种情况的处理方法作为补充。 参考用户提供的引用内容,比如引用3中提到Lua字符串分为short和long,但具体到判断应该不影响。另外引用2中的Lua脚本里有检查参数是否存在,如`if not args.name`,这可能涉及到nil的情况,但用户的问题是关于字符串,所以需要区分变量存在但字符串的情况。 总结下来,正确的做法应该是先检查变量是否存在(是否为nil),然后检查其长度是否为0。同时,如果变量可能不是字符串类型,比如可能是数字或其他类型,应该先转换为字符串或者做类型检查,比如用`type(str) == "string"`。但一般来说,在Lua中如果变量被赋值为字符串,类型就是string,所以主要考虑nil和字符串的情况。 可能的代码示例是: ```lua if str == nil or str == "" then print("字符串") else print("字符串不为") end ``` 或者用长度: ```lua if not str or #str == 0 then print("字符串") end ``` 需要注意的是,如果str是其他类型,比如数字,用`#`会得到不同的结果,比如数字123的长度是0吗?不,数字作为字符串的话可能需要先转换成字符串,但Lua中数字和字符串是不同的类型。所以如果用户传入的可能不是字符串类型,需要先转换或者检查类型。但用户的问题明确说是判断字符串是否为,所以假设变量已经是字符串类型。比如用户从某个地方获取的字符串参数,可能为字符串或者nil。 在引用2的例子中,Lua代码检查POST参数是否存在,用的是`if not args.name`,这可能是因为如果参数不存在,args.name会是nil。如果参数存在但值为字符串,则`args.name`会是字符串。所以用户可能需要同时处理这两种情况:变量为nil或者变量是字符串。 因此,正确的判断方法应该是综合检查这两种情况。即,如果变量为nil或者变量等于字符串,则视为。或者使用更简洁的长度检查,因为如果变量为nil,`#str`会报错,所以需要用逻辑或来先判断nil的情况。 所以最终的判断条件应该是: ```lua if str == nil or str == "" then ``` 或者: ```lua if not str or str == "" then ``` 或者更简洁的: ```lua if tostring(str) == "" then ``` 但要注意`tostring(nil)`会变成"nil",所以这种方法不可行。因此,最安全的方式还是先检查是否为nil,再检查是否为字符串。 此外,用户可能还需要处理包含白字符的情况,比如使用`str:match("%S")`来检查是否有非白字符。这时候可以建议用户使用trim函数去除首尾格后再判断是否为。例如: ```lua function trim(s) return s:gsub("^%s+", ""):gsub("%s+$", "") end if str == nil or trim(str) == "" then -- 视为 end ``` 不过这可能超出用户当前的问题范围,但可以作为扩展建议。 总结回答步骤: 1. 判断变量是否为nil。 2. 判断字符串是否为字符串(长度为0)。 3. 可选:处理包含白字符的情况。 4. 提供示例代码,并解释每个步骤。 同时,根据用户的引用3中提到Lua字符串的内部处理,但这对判断字符串没有直接影响,所以可能不需要涉及。 相关问题部分需要考虑用户可能的后续问题,比如如何处理字符串,如何判断字符串是否为nil,或者如何检查变量是否为字符串类型等。</think>在Lua中判断字符串是否为,可以通过以下方法实现: ### 方法1:直接判断字符串 若变量已确保为字符串类型,可直接用等号判断: ```lua if str == "" then print("字符串") end ``` ### 方法2:兼容nil值的安全判断 若变量可能为`nil`,需先进行存在性检查: ```lua if not str or str == "" then print("字符串或未定义") end ``` 此方法同时覆盖了变量为`nil`或字符串的情况[^2]。 ### 方法3:处理含白字符的字符串 若需排除纯白字符(如`" "`),可结合字符串匹配: ```lua if not str or not str:match("%S") then print("字符串或仅含白字符") end ``` 其中`%S`匹配任意非白字符,若未找到则说明字符串无效。 ### 方法4:使用长度判断 通过长度操作符直接验证: ```lua if not str or #str == 0 then print("字符串长度为0") end ``` --- ### 示例代码 ```lua local input1 = "" local input2 = nil local input3 = " " -- 基础判断 if not input1 or input1 == "" then print("input1为") -- 会执行 end -- 带白字符判断 if not input3 or not input3:match("%S") then print("input3无效") -- 会执行 end ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值