regex - 正则表达式:需要匹配一组字符而不匹配另一组字符
问题描述
我有两种类型的输入,
str_1 = 'rb_done_1'
str_2 = 'rb_${4}done'
我需要正则表达式来匹配真正的只有一个。我最好的尝试是:
reg_1 = '(^[a-zA-z0-9_]+[^{}$]$)' # returns true for 1 and false for 2, this is desired output
reg_2 = '(^[a-zA-z0-9_][\${}]+$)' # returns false for both case, should return false for 1 and true for 2
^ .. $用于进行完整的字符串匹配。在 reg_2 中,我试图匹配来自'a-zA-z0-9_' 的一个或多个字符以及来自'${}' 的一个或多个字符(必须至少有一个来区分两种类型的输入)。
解决方案
关于您尝试的模式
第一个模式
^[a-zA-z0-9_]+[^{}$]$
匹配第一个字符串,因为最后一部分[^{}$]
是一个否定字符类,它将匹配除字符类中列出的任何字符之外的任何字符。这意味着末尾的 1
rb_done_1
将匹配[^{}$]
第二个模式
^[a-zA-z0-9_][\${}]+$
不匹配两者,因为开头的字符类没有量词,但第二个有量词,这意味着字符串的第二个字符直到结尾必须是$
{
或之一}
注意A-z
不一样_A-Za-z
对于第一个字符串,您可以匹配 1 次以上的单词字符。
^\w+$
对于第二个字符串,您可以使用肯定的前瞻(?=
来确保至少有一个 char$
{
或}
并确保至少有一个单词字符
^(?=.*[${}])(?=.*\w)[\w${}]+$
或者使用更有效但模式稍长的否定字符类
^(?=[^${}\r\n]*[${}])(?=[^\w\r\n]*\w)[\w${}]+$
推荐阅读
- azure - 用于审核 NSG 规则 sourceAddressPrefix 的 Azure 策略
- javascript - 从我的仪表板组件中捕获 user_id 的问题... -- Laravel / Vue.js
- windows - 如何在 Windows 10 上安装旧版本的 GCC
- dask - 从 dask 仪表板诊断带宽
- linux - 在带有“kathara Image”的 Docker 容器中执行简单的历史 bash 脚本时出错
- python - 可以使用中央资源文件在所有测试用例中导入多个库和关键字文件可能会导致执行期间出现性能问题
- c++ - 将两个不同的类对象向量排序在一起
- java - 如果列表项在一个变量中具有相同的值,则使用不同的变量比较列表
- java - 多模块Maven项目中的JAXBContext缓存
- ios - 使用带有自定义单元格和下一个按钮的 TableView 在数组中加载下一个问题