我有以下输入:
!foo[bar[bB]uz[xx/
我想匹配从start到[
的所有内容,包括转义括号[
,并在[!#s]
组
foo[bar
我试过了:
(?![!#s])[^/s]+[
但是它返回:
foo[bar[bB]uz[
Java:使用向后插入
(?<=!)(?:\[|[a-z])+
查看regex演示
- 后面的
(?<=!)
断言当前位置之前的是字符!
- 非捕获组
(?:\[|[a-z])
匹配[
或|
,a
和z
之间的字母 -
+
使组匹配一次或多次
- 零长度断言的前向和后向
- 掌握向前看和向后看
你可以使用这个正则表达式:
!((?:[^[\]*\[)*[^[]*)
在线Regex演示
- 在
[^/s]+
之后添加?
以捕获最短的组 - 将
w+
添加到末尾以捕获[
后的第一组字母数字字符
(?![!#s])[^/s]+?[w+
你可以试试这个模式:
(?<=^[!#s]{0,1000})(?:[^!#s\[]|\.)(?>[^[\]+|\.)*(?=[)
模式细节:
开头是向后看,表示前面有0或几个字符串开头的禁止字符
(?:[^!#s\[]|\.)
确保第一个字符是允许的字符或转义字符。
(?>[^[\]+|\.)*
描述内容:所有不是[
或,或转义字符的内容。(注意这个子模式也可以这样写:
(?:[^[\]|\.)*
)
(?=[)
检查下一个字符是否为字面值的开始方括号。(由于所有转义字符都由前一组匹配,因此可以确保此字符没有转义)
链接到小提琴 (Java推按钮)
首先使用否定字符类(即匹配必须不以特殊字符开头),然后使用不愿量词(在第一次点击时停止),后面使用否定字符以跳过转义括号:
[^!#s].*?(?<!\)[
查看现场演示