将所有内容匹配到第一个未转义(使用)字符



我有以下输入:

!foo[bar[bB]uz[xx/

我想匹配从start到[的所有内容,包括转义括号[,并在[!#s]

中提交第一个字符预期输出:

foo[bar

我试过了:

(?![!#s])[^/s]+[

但是它返回:

foo[bar[bB]uz[

Java:使用向后插入

(?<=!)(?:\[|[a-z])+

查看regex演示

  • 后面的(?<=!)断言当前位置之前的是字符!
  • 非捕获组(?:\[|[a-z])匹配[|, az之间的字母
  • +使组匹配一次或多次
参考

  • 零长度断言的前向和后向
  • 掌握向前看和向后看

你可以使用这个正则表达式:

!((?:[^[\]*\[)*[^[]*)

在线Regex演示

  • [^/s]+之后添加?以捕获最短的组
  • w+添加到末尾以捕获[后的第一组字母数字字符
结果:

(?![!#s])[^/s]+?[w+

你可以试试这个模式:

(?<=^[!#s]{0,1000})(?:[^!#s\[]|\.)(?>[^[\]+|\.)*(?=[)

模式细节:

开头是向后看,表示前面有0或几个字符串开头的禁止字符

(?:[^!#s\[]|\.)确保第一个字符是允许的字符或转义字符。

(?>[^[\]+|\.)*描述内容:所有不是[,或转义字符的内容。(注意这个子模式也可以这样写:(?:[^[\]|\.)*)

(?=[)检查下一个字符是否为字面值的开始方括号。(由于所有转义字符都由前一组匹配,因此可以确保此字符没有转义)

链接到小提琴 (Java推按钮)

首先使用否定字符类(即匹配必须不以特殊字符开头),然后使用不愿量词(在第一次点击时停止),后面使用否定字符以跳过转义括号:

[^!#s].*?(?<!\)[

查看现场演示

最新更新