将所有内容与第一个未转义(带\)字符匹配

时间:2014-07-16 08:29:34

标签: regex

我有以下输入:

!foo\[bar[bB]uz\[xx/

我希望匹配从开始到[的所有内容,包括转义括号\[,如果在[!#\s]组中,则忽略第一个字符

预期产出:

foo\[bar

我试过了:

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

但它返回:

foo\[bar[bB]uz\[

5 个答案:

答案 0 :(得分:0)

  • ?之后添加[^/\s]+以抓住可能的最短群组
  • \w+
  • 之后添加\[以捕获第一组字母数字字符

结果:

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

Try it

答案 1 :(得分:0)

您可以使用此正则表达式:

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

Online Regex Demo

答案 2 :(得分:0)

Java:使用Lookbehind

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

请参阅regex demo

<强>解释

  • lookbehind (?<=!)断言当前位置之前的是!
  • 非捕获组(?:\\\[|[a-z])匹配\[| az之间的字母
  • +会导致群组匹配一次或多次

<强>参考

答案 3 :(得分:0)

你可以尝试这种模式:

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

模式细节:

开头是一个lookbehind,意味着在字符串开头的前面有零个或几个禁止字符

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

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

(?=\[)检查下一个字符是文字​​开头方括号。 (因为所有转义字符都与先前组匹配,您可以确定此转义字符未被转义)

link to fiddle (按Java按钮)

答案 4 :(得分:0)

首先使用否定字符类开始(即匹配必须以特殊字符开头),然后是一个不情愿的量词(停止在第一次命中) ,以负面的外观来跳过转义括号:

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

请参阅live demo