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 ) + ".*" );
也是动态自适应的。
我想检查字符串中是否存在 {
或 $
等特殊字符。我使用了 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 ) + ".*" );
也是动态自适应的。