【问题标题】:String comparison in Java without spacesJava中没有空格的字符串比较
【发布时间】:2012-09-12 09:22:33
【问题描述】:

伙计们,

我对 Java 中的字符串比较(中间有空格)有点怀疑。

用例:-
考虑以下 Solr 查询字符串:-

  String query = ".....&ansDt:[* TO *]....";

ansDt 的有效格式是:-

  1. ansDt : [* TO *]
  2. ansDt : [someDate TO *]
  3. ansDt : [* TO someDate]
  4. ansDt : [someDate TO otherDate]

我有两个疑问:-

  • 现在,我需要一种方法来检查查询字符串中是否只有4th ansDt 格式。如果遇到其他格式(简而言之,如果在ansDt 字段中遇到任何* 模式),我需要在控制台上抛出一些消息。

  • 此外,无论ansDt:[ 之间的空格如何,我都需要检查第一种、第二种和第三种情况。即ansDt: [* TO *]ansDt :[* TO *]ansDt : [ * TO *]等都被认为是相同的

我不能使用String.trim( ),因为它只会删除字符串的开头和结尾空格

如何通过 Java 字符串比较来检查?

谢谢

【问题讨论】:

    标签: java regex string stringbuilder string-comparison


    【解决方案1】:

    请试试这个正则表达式:

    String query = ".....&ansDt:[* TO *]....";
    
    String pattern = ".*ansDt[\\ ]*[:][\\ ]*[\\[].*[\\ ]+TO[\\ ]+.*[\\]].*"; 
    
    boolean test = query.matches(pattern);
    

    附加信息:

    . matches any character
    
    .* matches any amount of characters
    
    [\ ] matches space
    
    [\ ]+ matches one or more spaces, used between "TO"
    
    [\ ]* matches any amount of spaces, used between ":"
    
    [\[] and [\]] matches "[" and "]"
    

    【讨论】:

    • +1,但请使用 StackOverflow 的优秀 code formatting features,正如我所展示的那样;简单地将文本包装在 <code> 标签中是行不通的。我还按照 Java 字符串文字的要求转义了您的正则表达式中的反斜杠,但您实际上并不需要转义空格字符 ("[\\ ]*"); "[ ]*"" *" 都可以。
    【解决方案2】:

    正则表达式是要走的路。但是为了快速修复,您可以尝试

        String query = ".....&ansDt : [ * TO *]...."; 
        int indexOfansDt = query.indexOf("ansDt");
        int indexOfBeginBracket = query.indexOf("[",indexOfansDt);
        int indexOfEndBracket = query.indexOf("]",indexOfBeginBracket);
        String yourString = query.substring(indexOfBeginBracket, indexOfEndBracket+1);
        System.out.println(yourString);
    

    检查yourString 是否有indexOf("*"),如果不是-1,则您的格式是1,2 或3。但是有很多错误情况,您必须检查NPE。

    【讨论】:

      【解决方案3】:

      您需要比简单的正则表达式更复杂的东西。您已经编写了相当于四行语法的内容。您应该采用解析器生成器的方法:对其进行标记,然后执行规则以查看标记是否与您的语法匹配。

      如果你能忍受解析器生成器的大锤,我会推荐 ANTLR。

      【讨论】:

      • 就像我说的,这是一把大锤子。尝试 ANTLR 教程,看看您是否可以为您的四行案例编写语法。或者只是对其进行标记并剔除“如果”的情况。
      【解决方案4】:

      应该这样做(对于字符串s1s2):

      s1.replace(" ", "").equals(s2.replace(" "), ""))
      

      【讨论】:

      • 如何检查案例 2 ?在字符串比较的时候,我们可能不知道someDate的值
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-06
      • 1970-01-01
      • 2020-09-11
      • 2011-05-03
      • 2014-11-11
      • 2012-06-28
      • 1970-01-01
      相关资源
      最近更新 更多