2016-08-30 159 views
4

我是新来的正则表达式。我试图构造一个正则表达式,前三个字符必须是字母,然后字符串的其余部分可以是任何字符。如果前三个字符后的字符串的部分包含&那么这部分应该开始和结束”。if条件的正则表达式

我能够构建^ [AZ] {3},但停留在条件语句。

灿这可以在一个单一的表达做

+5

你能给我们一个使用真实单词的例子,结果是什么? – Justplayit94

+1

你可以用交替来做到这一点。例如'^ [az] {3}([^&] * |“。*”)$' – jsheeran

+0

例如abcENT和abc“E&T”是有效的字符串,但不是abcE&T – user2359634

回答

3

在大多数正则表达式的口味,你可以使用简单的向前看符号,以确保一些文本存在或不存在的地方到当前位置的右侧,并使用交替操作|有可能检查替代品。

所以,我们基本上有两种选择:在前三个字母之后的字符串中有一个&,或者不是。因此,我们可以用

^[A-Za-z]{3}(?:(?=.*&)".*"|(?!.*&).*)$ 

regex demo

详细

  • ^ - 字符串的开始
  • [A-Za-z]{3} - 3个字母
  • (?:(?=.*&)".*"|(?!.*&).*) - 无论是两替代品:
    • (?=.*&)".*" - 如果有一个&某处的字符串((?=.*&))匹配",那么任何0+字符,然后"
    • | - 或
    • (?!.*&).* - 如果没有&(?!.*&))在字符串中,只需匹配任何0+字符即可...
  • $ - 字符串结尾。

在PCRE,或者.NET,或者一些其他的正则表达式的口味,你可以访问条件结构。这里是一个PCRE demo

^[A-Za-z]{3}(?(?=.*&)".*"|.*)$ 
      ^^^^^^^^^^^^^^^^^ 

(?(?=.*&)".*"|.*)手段:

  • (?(?=.*&) - 如果有&之后的任何字符0+ ...
  • ".*" - 比赛"anything here"般串
  • | - 或者如果不存在&
  • .* - 匹配当前位置的任何0+个字符(即之后的前3个字母)。
0

是啊,这是可能的,这是不是一个真正的如果,但是你的情况,你可以做一个“或”用正则表达式捕获组你的正则表达式看起来类似的东西:?

\d{3}(\".*\"|[^&]*) 

PS here是一个很好的网站来测试和学习这些东西: https://regex101.com/

0

正则表达式不一定支持条件与'if'一样,为了在一般情况下实现这个条件,你必须声明你的条件是可选的。 (但见Wiktor的的评论,这取决于你的正则表达式引擎有可能是可用的条件语句。)

对于一个相对基本的解决方案,你可以尝试这样的事:

^[a-z]{3}([^&]*|\..*\.)$ 

它说“后四个字母,应该有是任何长度的字符串,没有符号(&)或字符串开始,以一个句号结束

+0

请参阅https://msdn.microsoft.com /en-us/library/36xybswe(v=vs.110).aspx#Conditional_Expr –

+0

Wiktor:有趣的扩展。值得一看,如果你的正则表达式引擎支持它。 – Jan

+0

三个字母之后应该有一个任意长度的字符串,但即使在三个字母后没有字符串,也可以工作。请你帮忙吗? – user2359634

1

条件语句可以在使用()|。和群体,但它可能会很复杂

^[a-z]{3}([^&]*$|".*"$) 

你可能会考虑使用普通的旧的字符串操作完成这个任务,它可能会是简单

+0

^[a-z] {3}([^&] + $ |“。*”$)为我工作。谢谢! – user2359634

0

本身将取决于你使用正则表达式解析器的表达。如果你使用Python,shell,vim,boost等,相同的符号可能有不同的含义。

我会尝试以下方法:

$ echo 'abc"&def"' | grep -E "^[a-zA-Z]{3}(\".*\&.*\"|[^&]*)" 
abc"&def"