开发者

RegEx, colon separated list

I am trying to match a list of colon separated emails. For the sake of keeping things simple, I am going to leave the email expression out of the mix and match it with any number of characters with no spaces in between them.

The following will be matched...

somevalues  ;somevalues;       somevalues;

or

somevalues; somevalues             ;somevalues

The ending ; shouldn't be necessary.

The following would not be matched.

somevalues ;   some values    somevalues;

or

some values; somevalues some values

I have gotten this so far, but it doesn't work. Since I allow spaces between the colons, the expression doesn't know if 开发者_运维知识库the space is in the word, or between the colon.

([a-zA-Z]*\s*\;?\s*)*

The following is matched (which shouldn't e)

somevalue ; somevalues  some values;

How do I make the expression only allow spaces if there is a ; to the left or right of it?


Why not just split on semi colon and then regex out the email addresses?


This following PCRE Expression should work.

\w+\s*(?:(?:;(?:\s*\w+\s*)?)+)?

However if putting the email address validation regular expression on this will require replacing \w+ with (?:<your email validation regex>)

Probabbly This is exactly what you want, tested on http://regexr.com?2rnce

EDIT: However depending on the language you might? need to escape ; as \;


The problem comes from the ? in \;?

[a-zA-Z]*(\s*;\s*[a-zA-Z]*)*

should work.


Try

([a-zA-Z]+\s*;\s*)*([a-zA-Z]+\s*\)?

Note that I changed * to + on the e-mail pattern since I assume you don't want strings like ; to match.


to solve this with regex, you must prepend + append the delimiter to your input lines, otherwise you cannot easily detect the first and last item

#!/bin/bash

input=a:aa:aaa:aaaa
needle=aa
if [[ ":$input:" =~ ":$needle:" ]]
then
  echo found
else
  echo not found
fi
# -> found

.. this takes 45 nanoseconds

bash globbing is faster with 35 nanoseconds

input=a:aa:aaa:aaaa
needle=aa
if [[ ":$input:" == *":$needle:"* ]]
then
  echo found
else
  echo not found
fi
# -> found

stupid solution: split by delimiter and match whole lines. this one is really slow, with 5100 nanoseconds

echo a:aa:aaa:aaaa | tr ':' $'\n' | grep "^aa$"
# -> aa
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜