RegEx,冒号分隔列表

时间:2010-07-04 18:47:40

标签: regex list

我正在尝试匹配冒号分隔的电子邮件列表。为了简单起见,我将把电子邮件表达式从混合中删除,并将它与任意数量的字符匹配,它们之间没有空格。

以下内容将匹配......

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;

如果有表达式,如何使表达式只允许空格;在它的左边或右边?

5 个答案:

答案 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