给定字符串beginend
wherebegin
和end
都是可选的,我想匹配整个字符串和 back-reference only begin
。Begin
未知但字母数字;end
是字面意思end
。我该怎么做呢?
万一这很重要,我将在 Textpad 宏中使用它来将“beginend”替换为其他内容,包括“begin”。
给定字符串beginend
wherebegin
和end
都是可选的,我想匹配整个字符串和 back-reference only begin
。Begin
未知但字母数字;end
是字面意思end
。我该怎么做呢?
万一这很重要,我将在 Textpad 宏中使用它来将“beginend”替换为其他内容,包括“begin”。
已编辑(参见块引用后)
我没有评论权限,所以我不能评论他的解决方案,但 Qtax 的解决方案将不起作用,因为它假定
begin
永远不会包含子字符串“end”,例如,它不会匹配字符串“sendingend”。我的解决方案:
^([A-Za-z0-9]*)(?:end)?$
当然,这也取决于您所说的alphanumeric是什么意思。我的例子有最严格的定义,即只有大写和小写字母加上数字。如果需要,您需要添加其他字符。如果你想包括下划线以及那些字符,你可以
[A-Za-z0-9]
用\w
(相当于[A-Za-z0-9_]
)替换整个笨重的。\s
如果需要空格,请添加。既然你说你的正则表达式知识是有限的,我会向你和其他人解释解决方案的其余部分。
^
并$
分别匹配字符串的开头和结尾。通过对于这个当前字符串实际上并不重要,因为$
特别包含,您可以保证您遇到的最后一个“结束”确实在最后。例如,没有它们,它仍然会匹配字符串“sendingsending”,而您的程序的其余部分会认为它在末尾找到了“end”。有了这些,它仍然会匹配“sendingsending”,因为允许任何字符(见下文),但脚本中的其他步骤将识别“end”的存在。([A-Za-z0-9]*)
如果“end”不存在,它将捕获整个字符串。然而,(end)$
找到它。([A-Za-z0-9]*)
:方括号包含允许的特定字符(如果您不知道,您一定要阅读此内容)。这*
意味着它将匹配这些字符之一 0 次或更多次,因此这允许没有字符串(即,仅“结束”)以及超长字符串。括号正在捕获该模式,因此您可以反向引用它。(?:end)?
:最后一个?
使它匹配这个模式0或1次(即,使它成为可选的)。该(?:string)
结构允许您像使用括号一样将字符组合在一起,但?:
它不会保存该模式,因此它使用的内存更少。在您的情况下,该内存可以忽略不计,但很高兴知道以备将来使用。如果您需要更多帮助,请尝试使用 Google 搜索“正则表达式”。有很多很好的参考资料。您也可以测试它们。我个人最喜欢的测试器叫做My Regex Tester。
祝你好运!
我刚刚尝试查找 TextPad 宏,您可能会遇到问题。正如我上面所解释的,要验证字符串末尾是否存在“end”,您需要一些单独的东西。我正在设想某种条件,例如 IF (end)$
THEN 替换为^([A-Za-z0-9]*)(?:end)?$
ELSE 使用整个字符串。但是,我不知道您是否可以使用这些宏来做到这一点……很难说,因为我不是 TextPad 用户,而且几乎没有文档。如果你不能,那么我认为你将不得不对其施加一些限制。一个想法是不允许“结束”出现在begin
子字符串(Qtax 的解决方案就是这样做的)。但是现在我想知道……如果“结束”是可选的,并且如果不允许使用条件,那么拥有它有什么意义呢?...也许我想太多了。我在等你的回复。
尝试使用积极的前瞻性。这是一个零宽度断言,因此不会包含在匹配中。它还允许子字符串end
出现在字母数字字符串中
([a-z0-9]*)(?=end)
这就是说:仅在紧跟其后的情况下才匹配字母数字字符串end
要匹配不包含“end”的“字母数字”字符串,您可以使用以下内容:
(?:(?!end)[A-Za-z\d])+
像这样的表达式可以满足您的要求:
^((?:(?!end)[A-Za-z0-9])+)(?:end)?\z