如何在字符串中简单查找子字符串?string.find函数异常问题咨询
解决字符串查找时误把参数当正则的坑
哈哈,我太懂这种踩坑的感觉了——本来想找个普通子串,结果因为方法用错或者规则没搞清楚,触发了正则相关的异常!我来给你捋清楚怎么解决:
先搞清楚核心问题:你可能用错了查找方法
首先,要是你用的是Python的str.find(),那它根本不会把第二个参数当正则!它的第二个参数其实是「查找的起始位置」(默认从0开始),第三个参数是结束位置。举个例子:
text = "Hey, I have a question about regex?" # 直接找带?的子串,完全按字面量匹配 pos = text.find("regex?") print(pos) # 会输出31,一点问题都没有,不会把?当成正则的特殊符号
那你为啥会碰到正则相关的异常?大概率是不小心用了re模块的方法,比如re.search()或者re.findall()——这些方法才会把传入的字符串当正则解析。
两种解决方案,看你需求选
方案1:用原生字符串查找方法(推荐,简单直接)
如果只是单纯找普通子串,直接用语言原生的字面量查找方法就好:
- Python:
str.find()、str.index()(找不到会抛异常,这是和find的核心区别) - JavaScript:
String.indexOf()、String.includes()
这些方法完全不会处理正则特殊字符,就是纯纯的字面量匹配,省心又不容易出错。
方案2:必须用正则的话,记得转义特殊字符
要是你因为业务需求非得用正则(比如要做复杂匹配),但目标子串里包含正则特殊字符(比如. * + ? ^ $ [] () {} | \这些),那一定要先转义:
以Python为例:
import re text = "Hey, I have a question about regex?" target_substr = "regex?" # 用re.escape转义所有特殊字符,把?变成\? escaped_target = re.escape(target_substr) match_result = re.search(escaped_target, text) if match_result: print(f"找到啦,位置在:{match_result.start()}")
JavaScript的话,可以自己写转义逻辑:
const text = "Hey, I have a question about regex?"; const target = "regex?"; // 转义正则特殊字符 const escapedTarget = target.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); const match = text.match(new RegExp(escapedTarget)); console.log(match?.index);
最后再提醒一句
下次碰到这种问题,先检查自己用的是不是正则模块的方法——很多时候都是手滑用错了方法才踩的坑!
内容的提问来源于stack exchange,提问作者Bdfy
相关产品推荐
相关产品推荐

