寻找一点正则表达式的帮助.我想设计一个表达式,匹配一个字符串与" foo "或" bar ",但不是" foo "和" bar "
如果我做的事情......
/((foo)|(bar))/
Run Code Online (Sandbox Code Playgroud)
它会匹配" foobar ".不是我想要的.那么,只有当一个术语或另一个术语存在时,如何才能使正则表达式匹配?
谢谢!
小智 31
这是我使用的:
/^(foo|bar){1}$/
Run Code Online (Sandbox Code Playgroud)
请参阅:http://www.regular-expressions.info/quickstart.html重复
eri*_*son 18
如果您的正则表达式语言支持它,请使用否定的外观:
(?<!foo|bar)(foo|bar)(?!foo|bar)
Run Code Online (Sandbox Code Playgroud)
这将匹配"foo"或"bar",它不会立即在"foo"或"bar"之前或之后,我认为这就是你想要的.
从您的问题或示例中可以看出,您尝试匹配的字符串是否可以包含其他标记:"foocuzbar".如果是这样,这种模式将不起作用.
以下是测试用例的结果("true"表示在输入中找到了模式):
foo: true
bar: true
foofoo: false
barfoo: false
foobarfoo: false
barbar: false
barfoofoo: false
Run Code Online (Sandbox Code Playgroud)
你可以用一个正则表达式做到这一点但我建议为了你的可读性你做的事情...
(/foo/ and not /bar/) || (/bar/ and not /foo/)
Run Code Online (Sandbox Code Playgroud)
这将采用'foo'和'bar'但不是'foobar'而不是'blafoo'而不是'blabar':
/^(foo|bar)$/
^ = mark start of string (or line)
$ = mark end of string (or line)
Run Code Online (Sandbox Code Playgroud)
这将采用'foo'和'bar'和'foo bar'和'bar-foo'但不是'foobar'而不是'blafoo'而不是'blabar':
/\b(foo|bar)\b/
\b = mark word boundry
Run Code Online (Sandbox Code Playgroud)