独家或正则表达

Soc*_*sus 29 regex xor

寻找一点正则表达式的帮助.我想设计一个表达式,匹配一个字符串与" foo "或" bar ",但不是" foo "和" bar "

如果我做的事情......

/((foo)|(bar))/
Run Code Online (Sandbox Code Playgroud)

它会匹配" foob​​ar ".不是我想要的.那么,只有当一个术语或另一个术语存在时,如何才能使正则表达式匹配?

谢谢!

小智 31

这是我使用的:

/^(foo|bar){1}$/
Run Code Online (Sandbox Code Playgroud)

请参阅:http://www.regular-expressions.info/quickstart.html重复

  • 我同意@Karl 的观点,这不是异或。它只检查整个字符串是否是“foo”或“bar” (4认同)
  • 这是错误的,它仅表示foo或bar应该只匹配一次。 (3认同)
  • 您不需要“{1}”,因为这表示它应该重复 1 次。有 `/^(foo|bar)$/` 就足够了。这个正则表达式起作用的原因是你使用了“^”和“$”;它与重复无关。 (3认同)
  • 比接受的答案更优雅的解决方案,尤其是当您有超过 2 个案例时。 (2认同)

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)

  • 谢谢你教我一些负面的看法:) (3认同)

Ed *_*ess 9

你可以用一个正则表达式做到这一点但我建议为了你的可读性你做的事情...

(/foo/ and not /bar/) || (/bar/ and not /foo/)
Run Code Online (Sandbox Code Playgroud)

  • 或者甚至更好,/foo/ xor /bar/,如果您的语言有 XOR 运算符。(Perl 可以。) (3认同)
  • 事实上,我很确定我会将 XOR 逻辑放入代码本身,而不是在正则表达式中。 (2认同)

ori*_*dam 6

这将采用'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)