我是正则表达的新手。我正在尝试构造一个正则表达式 前三个字符必须是字母,然后字符串的其余部分可以是任何字符。如果前三个字符后面的字符串部分包含&那么这部分应该以"开始和结束。
我能够构建^ [a-z] {3},但却陷入了条件语句。
这可以在一个表达式中完成吗?
答案 0 :(得分:9)
在大多数正则表达式中,您可以使用简单的前瞻来确保某些文本存在或不在当前位置右侧的某个位置,并且使用交替运算符|
可以检查备选方案。
所以,我们基本上有两种选择:在前3个字母后面的字符串中有一个&
,或者不是。因此,我们可以使用
^[A-Za-z]{3}(?:(?=.*&)".*"|(?!.*&).*)$
请参阅regex demo
<强>详情:
^
- 字符串开头[A-Za-z]{3}
- 3个字母(?:(?=.*&)".*"|(?!.*&).*)
- 两种选择中的任何一种:
(?=.*&)".*"
- 如果字符串中的某个&
((?=.*&)
)匹配"
,那么任何0+个字符,然后"
< / LI>
|
- 或(?!.*&).*
- 如果字符串中没有&
((?!.*&)
),只需匹配任意0+字符即可... $
- 字符串结束。在PCRE,或.NET或其他一些正则表达式中,您可以访问条件构造。这是一个PCRE demo:
^[A-Za-z]{3}(?(?=.*&)".*"|.*)$
^^^^^^^^^^^^^^^^^
(?(?=.*&)".*"|.*)
表示:
(?(?=.*&)
- 如果在任意0个字符之后有&
... ".*"
- 匹配"anything here"
- 类似字符串|
- 或者,如果没有&
.*
- 匹配当前位置的任何0+字符(即在前3个字母后面)。答案 1 :(得分:1)
条件语句可以与|一起使用和团体,但它可能会很复杂。
^[a-z]{3}([^&]*$|".*"$)
您可能会考虑使用普通的旧字符串操作来完成此任务,它可能很简单
答案 2 :(得分:0)
是的,这是可能的,它不是真的,但在你的情况下,你可以做一个&#34;或&#34;与正则表达式捕获组。你的正则表达式看起来像那样:
\d{3}(\".*\"|[^&]*)
P.S。这是一个很好的网站来测试和学习这些东西: https://regex101.com/
答案 3 :(得分:0)
正则表达式不一定像'if'那样支持条件,为了实现这一点,在一般情况下你必须说明你的条件作为替代。 (但请参阅Wiktor的评论,根据您的正则表达式引擎,可能存在条件。)
对于一个相对基本的解决方案,您可以尝试这样的事情:
^[a-z]{3}([^&]*|\..*\.)$
其中说“在四个字母之后,应该有一个任何长度的字符串,没有&符号(&amp;)或一个以句号开头和结尾的字符串(。)。
答案 4 :(得分:0)
表达式本身将取决于您将使用的正则表达式解析器。如果你正在使用Python,shell,vim,boost等,那么相同的符号可能有不同的含义。
我会尝试以下方法:
$ echo 'abc"&def"' | grep -E "^[a-zA-Z]{3}(\".*\&.*\"|[^&]*)"
abc"&def"