1

给定字符串beginendwherebeginend都是可选的,我想匹配整个字符串和 back-reference only beginBegin未知但字母数字;end是字面意思end。我该怎么做呢?

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

4

3 回答 3

0

已编辑(参见块引用后)

我没有评论权限,所以我不能评论他的解决方案,但 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 的解决方案就是这样做的)。但是现在我想知道……如果“结束”是可选的,并且如果不允许使用条件,那么拥有它有什么意义呢?...也许我想太多了。我在等你的回复。

于 2012-12-04T07:50:04.623 回答
0

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

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

这就是说:仅在紧跟其后的情况下才匹配字母数字字符串end

于 2012-12-04T10:29:28.177 回答
0

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

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

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

^((?:(?!end)[A-Za-z0-9])+)(?:end)?\z
于 2012-12-04T01:17:18.703 回答