indexOf() vs 正则表达式用于识别 $ 和 { 等特殊字符

indexOf() vs regex for identifying special characters like $ and {

我想检查字符串中是否存在 {$ 等特殊字符。我使用了 regexp 但在代码审查期间我被要求使用 indexOf() 而不是 regex( 因为它更昂贵)。我想了解如何使用 indexOf() 来识别特殊字符。 (我知道这可以用来索引子串)

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

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

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

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

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

有不止一种 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;
    }
}

矛盾的信息总是很难猜的。该代码不会查找 特殊字符 ,它会搜索 模式 - 而 indexOf 不会帮助您。

如果您需要找到模式 ${...}(而不是 "identifying special characters"),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 对目标的(上述)迭代之间的性能 "break even" 在哪里。但它可能更容易维护并允许动态适应特价商品集。

当然,简单的

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

也是动态自适应的。