【问题标题】:indexOf() vs regex for identifying special characters like $ and {indexOf() 与正则表达式,用于识别 $ 和 { 等特殊字符
【发布时间】:2016-03-22 02:11:43
【问题描述】:

我想检查字符串中是否存在像{$ 这样的特殊字符。我使用了正则表达式,但在代码审查期间,我被要求使用 indexOf() 而不是正则表达式(因为它的成本更高)。我想了解如何使用 indexOf() 来识别特殊字符。 (我熟悉这可以对子字符串进行索引)

String photoRoot = "http://someurl/${TOKEN1}/${TOKEN2}";
Pattern p = Pattern.compile("\\$\\{(.*?)\\}");
                    Matcher m = p.matcher(photoRoot);
                    if (m.find()) {
                        // logic to be performed
                    }

【问题讨论】:

  • 您是在问如何使用 indexOf 来确定字符串中是否存在字符,还是在问运行时复杂度?

标签: java regex indexof


【解决方案1】:

indexOf(...) 方法不止一个,但它们都对所有字符一视同仁,使用这些方法时无需转义任何字符。

以下是使用indexOf(...) 方法获取这两个令牌的方法:

String photoRoot = "http://someurl/${TOKEN1}/${TOKEN2}";
String startDelimiter = "${";
char endDelimiter = '}';
int start = -1, end = -1;
while (true) {
    start = photoRoot.indexOf(startDelimiter, end);
    end = photoRoot.indexOf(endDelimiter, start + startDelimiter.length());
    if (start != -1 && end != -1) {
        System.out.println(photoRoot.substring(start + startDelimiter.length(), end));
    } else {
        break;
    }
}

【讨论】:

    【解决方案2】:

    如果您只想查找几个不同的特殊字符,您只需使用 indexOf("$") 或 indexOf("}")。您需要分别指定要查找的每个特殊字符。

    虽然没有办法让它在一个语句中找到每个特殊字符的索引:https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#indexOf(int)

    【讨论】:

      【解决方案3】:

      如果您只需要检查问题中的 2 个字符,答案将是

      var found = photoRoot.indexOf("$") >=0 ||| photoRoot.indexOf("?") >=0;
      

      【讨论】:

        【解决方案4】:

        当存在相互矛盾的信息时,总是很难猜测。该代码不寻找特殊字符,它搜索一个模式 - indexOf 不会帮助你。

        如果您需要找到${...} 模式(而不是“识别特殊字符”),Titus 的回答有助于避免模式匹配

        如果(正如审阅者认为的那样)您只需要查找可以重复应用 indexOf( on_special_char ) 的一组特殊字符中的任何一个,但您也可以这样做

        for( int i = 0; i < photoRoot.length(); ++i ){
            if( "${}".indexOf( photoRoot.charAt(i) ) >= 0 ){
                // one of the special characters is at pos i
            }
        }
        

        不确定目标字符串上的多个 indexOf 调用和目标上的(以上)迭代之间的性能“收支平衡”在哪里,其中 indexOf 在包含特价的(短)字符串上。但它可能更容易维护并允许动态适应一组特价商品。

        当然,简单

        photoRoot.matches( ".*" + Pattern.quote( specials ) + ".*" );
        

        也是动态自适应的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-11
          • 1970-01-01
          相关资源
          最近更新 更多