我正在尝试匹配冒号分隔的电子邮件列表。为了简单起见,我将把电子邮件表达式从混合中删除,并将它与任意数量的字符匹配,它们之间没有空格。
以下内容将匹配......
somevalues ;somevalues; somevalues;
或
somevalues; somevalues ;somevalues
结局;不应该是必要的。
以下内容不匹配。
somevalues ; some values somevalues;
或
some values; somevalues some values
到目前为止我已经得到了这个,但它不起作用。由于我在冒号之间允许空格,因此表达式不知道空格是在单词中,还是在冒号之间。
([a-zA-Z]*\s*\;?\s*)*
以下匹配(不应该是e)
somevalue ; somevalues some values;
如果有表达式,如何使表达式只允许空格;在它的左边或右边?
答案 0 :(得分:6)
为什么不拆分半冒号然后重新编写电子邮件地址?
答案 1 :(得分:1)
以下PCRE表达式应该有效。
\w+\s*(?:(?:;(?:\s*\w+\s*)?)+)?
但是,如果将电子邮件地址验证正则表达式放在此处则需要
将\w+
替换为(?:<your email validation regex>)
Probabbly这正是你想要的,在http://regexr.com?2rnce
上测试过编辑:但是根据您的语言而定?需要将;
转义为\;
答案 2 :(得分:0)
问题来自于?在\ ;?
[a-zA-Z]*(\s*;\s*[a-zA-Z]*)*
应该有用。
答案 3 :(得分:0)
尝试
([a-zA-Z]+\s*;\s*)*([a-zA-Z]+\s*\)?
请注意,我在电子邮件模式上将*更改为+,因为我假设您不希望匹配;
等字符串。
答案 4 :(得分:0)
要使用正则表达式解决此问题,必须在输入行前加上+分隔符,否则您将无法轻松检测到第一项和最后一项
#!/bin/bash
input=a:aa:aaa:aaaa
needle=aa
if [[ ":$input:" =~ ":$needle:" ]]
then
echo found
else
echo not found
fi
# -> found
..这需要45纳秒
bash globbing快了35纳秒
input=a:aa:aaa:aaaa
needle=aa
if [[ ":$input:" == *":$needle:"* ]]
then
echo found
else
echo not found
fi
# -> found
愚蠢的解决方案:用定界符分割并匹配整行。这真的很慢,只有5100纳秒
echo a:aa:aaa:aaaa | tr ':' $'\n' | grep "^aa$"
# -> aa