【问题标题】:Converting null into ""将空值转换为“”
【发布时间】:2020-06-16 20:45:16
【问题描述】:

如何将字符串中的空值正则表达式替换为“”?有什么方法可以让字符串忽略 null 或将其变成 ""?

    for (Row row : sheet) {

        cprCell = row.getCell(2);   //Kolonne med C

        String textValueForCPR = String.valueOf(cprCell);
        String convertNull = textValueForCPR.replaceAll((null), "");

        System.out.println(convertNull);

        }

【问题讨论】:

  • 你的意思是textValueForCPR != null ? textValueForCPR : ""
  • String.valueOf 从不返回 null。它可能会返回"null",但这不是一回事。
  • @AndyTurner 显然它确实返回 null。它需要一个空的 excel 单元格并将其读取为 null
  • 如果您的意思是 NULL character 而不是空指针(对象引用),请编辑您的问题以澄清。
  • 第一步:停止跳到“正则表达式”来解决所有问题。

标签: java regex string syntax null


【解决方案1】:

你可能正在寻找

String convertNull = textValueForCPR.replace("null", "");

【讨论】:

    【解决方案2】:

    tl;博士

    要删除任何 Unicode 代码点为零的 NULL 字符,请调用 String::replace,同时使用转义序列 CharSequence 和十六进制数为零 (\u0000) 传递单个字符 CharSequence

    input.replace( "\u0000" , "" )  
    

    详情

    Java 中的String 不能包含文本 空值,只能包含其中一个。所以我猜你使用术语null 并不意味着Java 中的空对象引用。

    NULL Unicode 和 ASCII 字符

    你一定是想问关于删除Unicodecode point0 被称为NULL。 (也在ASCII 中定义。)如果我的猜测是正确的,我建议您为了清楚起见编辑您的问题以避免投票。

    为此,我们需要表示一个控制字符。问题是根据定义,控制字符不能出现在文本中。所以我们使用 Java 中的转义序列来通过十六进制数来识别字符。转义以反斜杠和 u 开头。

    请注意,我们正在对特定文本(单字符CharSequence)进行搜索和替换。因此我们应该调用String::replace 而不是String::replaceAll,它接受一个正则表达式参数。虽然replaceAll 在技术上有效,但使用该方法无法代表我们在这里的意图并且是不合适的。

    String input = … ;
    String modified = input.replace( "\u0000" , "" ) ;
    

    示例用法。

    String input = "\u0000Dog\u0000Cat\u0000" ;
    int lengthBefore = input.length();
    String modified = input.replace( "\u0000" , "" ) ;
    int lengthAfter = modified.length();
    
    System.out.println( "lengthBefore = " + lengthBefore );
    System.out.println( "lengthAfter = " + lengthAfter );
    

    看到这个code run live at IdeOne.com

    lengthBefore = 9

    lengthAfter = 6

    其他途径

    String::trim

    String::trim 方法删除前导和尾随 whitespace 字符。它对空格的定义包括NULL 字符。请注意,我们没有删除此示例中间的 NULL,仅删除前面的 NULL 和后面的 NULL。所以长度是 7, 9-2。

    "\u0000Dog\u0000Cat\u0000"
    .trim()
    .length()
    

    7

    如果您的字符串只包含NULL 字符,则结果为空字符串。

    "\u0000"
    .trim()
    .length()
    

    0

    循环代码点

    您可以循环文本中的每个代码点。获取IntStreamintprimitives) representing each character's code point. Test if the code point is zero (a NULL` 字符流)。

    "\u0000Dog\u0000Cat\u0000"
    .codePoints()
    .forEach( 
        ( int codePoint ) -> System.out.println( 0 == codePoint ) 
    )
    
    true
    false
    false
    false
    true
    false
    false
    false
    true
    

    【讨论】:

    • ( "\u0000" , "" ) ;这似乎不可能在“replaceAll”之后写
    • 在替换字符串而不是替换正则表达式时,请使用replace 而不是replaceAll
    • @PraiseDaMemes 是的,它确实有效。参见示例code running live at IdeOne.com
    • @ArvindKumarAvinash 请将您的答案发布为正确的回复,以便我标记您。您的解决方案是真正的答案,非常感谢
    • @ArvindKumarAvinash 好点。我更改了我的代码并添加了您关于传递 CharSequence 与正则表达式作为参数的观点。
    猜你喜欢
    • 2017-05-04
    • 2012-02-18
    • 1970-01-01
    • 2018-06-12
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多