我正在寻找一种方法来匹配以下字符串中的可选ABC
。无论是否存在ABC
,两个字符串都应该匹配:
具有未定义长度的前一个字符串ABC具有未定义宽度的后一个字符串具有未定义长度的前一字符串
我试过
.*(ABC).*
这对可选的ABC
不起作用,但使ABC
不贪婪也不起作用——因为.*
将占据所有的优势:
.*(ABC)?.*
这不是重复的,例如Regex匹配两个字符串之间的所有字符,因为我在两个随机字符串之间寻找某个字符串,有点相反。
您可以使用
.*(ABC).*|.*
这是这样工作的:
.*(ABC).*
模式首先被搜索,因为它是替换的最左边部分(请参阅"记住Regex Engine is Eager"(,它会尽可能多地查找除换行符之外的任何零个或多个字符,然后将ABC
捕获到组1中,然后将行的其余部分与右边的.*
匹配|
-或- 如果第一替换部分不匹配,则搜索
.*
-
另一种无需使用交替的解决方案:
^(?:.*(ABC))?.*
请参阅此regex演示详细信息:
^
-字符串的开头(?:.*(ABC))?
-一个可选的非捕获组,它尽可能多地匹配零个或多个字符(换行字符除外(,然后将ABC
字符序列捕获到组1中.*
-零个或多个字符(换行字符除外(,尽可能多
我自己想出了一个答案:使用OR运算符似乎有效:
(?:(?:.*(ABC))|.*).*
如果有更好的方法,请随时回答,我会接受的。
您可以使用以下正则表达式:.*(ABC){0,1}.*
。它的意思是任意,可选的{min,max},任意。它更容易阅读。由于处理速度的原因,我不能说你的解决方案还是我的解决方案更快。选项:{value}
=n次{min,}
=最小到无穷大{min,max}
=最小至最大
.+([ABC])?.+
应该完成的工作