正则表达式找到&但不是&&

时间:2011-08-16 13:18:30

标签: regex

我确信这很简单,但我需要找到&字符的单次出现,而不是&&的任何实例。

对正则表达式所做的任何解释都会非常有帮助。

4 个答案:

答案 0 :(得分:3)

你可以做到

([^&]|^)&([^&]|$)

或者对我来说更美观的使用外观

(?<=[^&]|^)&(?=[^&]|$)

here online on Regexr

你必须检查字符串之前或之前没有&,并且前面没有&或字符串的结尾。

[^&]是一个否定的字符类,意味着匹配除&

之外的任何内容

[^&]|^匹配非&字符或字符串的开头(^

[^&]|$匹配非&字符或字符串末尾($

(?<=pattern)查看断言,确保pattern

之前

(?=pattern)向前看断言,确保pattern跟随

我的第一个解决方案和第二个解决方案之间的区别在于,第一个解决方案与之前和之后的字符匹配,第二个解决方案使用环绕声是零宽度断言,这意味着它们与字符不匹配,它们只是检查我们在那里。

答案 1 :(得分:3)

您没有指定风味,但如果它支持lookbehinds,您可以使用:

(?<!&)&(?!&)

尽管外观神秘,但模式非常简单:

  • (?<!&) - 在符号后检查当前位置 ...
  • & - ...匹配&符号......
  • (?!&) - ...并检查它不是符号之前。

答案 2 :(得分:1)

[^&]&[^&]

某些东西,不是&amp;,后面是&amp;,后跟其他东西。

如果你的表达式可以在行/ input / expression / string的开头或结尾,那么还有两种可能性:

 ^&[^&] 
 [^&]&$

现在您可以将它们与OR结合使用。

答案 3 :(得分:1)

您需要查找&左侧和右侧不是&或者没有任何内容的内容。

所以表达式将是:

([^&]|^)&([^&]|$)

第一组匹配不是&或行首的字符。然后是字符&,第二组匹配不是&或行尾的字符。