鉴于字符beginend
,其中begin
和end
都是可选的,我想匹配整个字符串和仅仅begin
的后引用。 Begin
未知但是字母数字; end
字面上是end
。我该怎么做呢?
如果它很重要,我会在Textpad宏中使用它来将“beginend”替换为包括“begin”在内的其他内容。
答案 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
后才匹配字母数字字符串