正则表达式匹配所有字符串除外

时间:2012-12-04 00:57:38

标签: regex

鉴于字符beginend,其中beginend都是可选的,我想匹配整个字符串和仅仅begin的后引用。 Begin未知但是字母数字; end字面上是end。我该怎么做呢?

如果它很重要,我会在Textpad宏中使用它来将“beginend”替换为包括“begin”在内的其他内容。

3 个答案:

答案 0 :(得分:0)

要匹配不包含“end”的字符串“字母数字”字符,您可以使用以下内容:

(?:(?!end)[A-Za-z\d])+

这样的表达式可以满足您的要求:

^((?:(?!end)[A-Za-z0-9])+)(?:end)?\z

答案 1 :(得分:0)

已编辑(请参阅blockquote之后)

  

我没有评论权限,所以我不能对他发表评论   解决方案,但Qtax的解决方案不起作用,因为它假设   begin永远不会包含子字符串“end”,例如,它不会   匹配字符串“sendingend”。

     

我的解决方案:       ^([A-Za-z0-9]*)(?:end)?$

     

当然,它还取决于字母数字的含义。我的   例子有最严格的定义,即只是大写和小写   字母加数字。如果需要,您需要添加其他字符   他们。如果你想包括下划线和那些   字符,您可以用[A-Za-z0-9]替换整个庞大的\w   (相当于[A-Za-z0-9_])。如果您想要空格,请添加\s

     

既然你说你的正则表达式知识是有限的,我会解释其余的   你和其他任何人的解决方案。

     
      
  • ^$分别匹配字符串的开头和结尾。 特别包括$,你就是   保证你遇到的最后一个“结束”真的在最后。   例如,没有它们,它仍将匹配字符串   “发送”和你的其他程序会认为它已被发现   结束时“结束”。有了这些,它仍然会匹配   “发送”因为允许任何字符(见下文),但是   脚本中的其他步骤将识别出存在   “结束”。这个电流实际上并不重要   字符串,因为([A-Za-z0-9]*)将捕获整个字符串if   “结束”不存在。但是,你需要另一个正则表达式   确保“结束”的存在或不存在...所以你会做类似的事情   (end)$找到它。
  •   
  • ([A-Za-z0-9]*):方括号包含允许的特定字符(如果是,您一定要阅读此内容)   你不知道)。 *表示它将匹配其中一个字符0   或更多次,因此这也不允许字符串(即,仅“结束”)   作为超长串。括号正在捕获这种模式   你可以反过来引用它。
  •   
  • (?:end)?:最后一个?使其与此模式匹配0或1次(即,使其成为可选项)。 (?:string)结构允许您   像括号一样将字符组合在一起,但是?:   使保存该模式,因此它使用更少的内存。在你的   在这种情况下,记忆力可以忽略不计,但知道这一点很好   未来的使用。
  •   
     

如果您需要更多帮助,请尝试Googling'正则表达式'。有很多好处   引用。你也可以测试它们。我最喜欢的测试人员   被称为My Regex Tester

     祝你好运!

我刚试过查找TextPad宏,你可能会遇到问题。正如我上面所解释的,为了验证字符串末尾是否存在“结束”,你需要一些单独的东西。我想象某种条件,比如IF (end)$然后用^([A-Za-z0-9]*)(?:end)?$替换ELSE使用整个字符串。但是,我不知道你是否能用这些宏做到这一点...很难说,因为我不是TextPad用户而且没有文档。如果你不能,那么我认为你将不得不对它施加一些限制。一个想法是不允许“结束”在begin子串中的任何位置(Qtax的解决方案就是这样做的)。但现在我想知道......如果“结束”如果是可选的,如果不允许条件,那么拥有它的重点是什么? ......也许我是在推翻事情。我等待你的回复。

答案 2 :(得分:0)

尝试使用积极的预测。这是一个零宽度断言,因此不会包含在匹配中。它还允许子字符串end出现在字母数字字符串

([a-z0-9]*)(?=end)

这是说:只有在紧跟end后才匹配字母数字字符串