排除整个单词并强制执行惰性正则表达式行为

时间:2018-01-08 13:33:58

标签: regex word-vba

我希望有一个正则表达式,它匹配文本中从“a”开始并以“e”结尾的所有单词组,但“the”文章中的结尾除外。例如,在句子“这里是四个睡觉的守卫,从一边被无敌的阳光击中”我需要匹配“一个无敌”,但不是“是”(我的另一个问题是如何强制vba匹配“是”而不是多余的“首先是”。到目前为止,我已经提出了以下模式:\ ba([^。,?;!]){1,50} [^ h] e \ b(我还排除了某些标点符号并将字符串长度限制为最多约50个字符:后者是我目前唯一能够长时间抑制,贪婪,即匹配的方式。我非常不完美的解决方案可以帮助我取消以“the”结尾的单词组,但显然也是以“he”结尾的单词,我不想要(我已经玩过前瞻,但很遗憾无法申请)在我的情况下的概念)。而且,我对这种低效率的方式来抑制过长的比赛感到不满意。你能帮我吗?

2 个答案:

答案 0 :(得分:0)

我建议使用负面的背后隐藏:

\ba[^.,?;!]{1,50}(?<!th)e\b

如果无法做到这一点,您的方法需要扩展到处理单词的3个字母:如果之前的那个字母是{&n}},则e之前的字母可以是h 39; t t

\ba[^.,?;!]{1,50}([^t]h|[^h])e\b

另外我猜它可能是&#34;&#34;&#34;如果它是诸如&#34;车床&#34;之类的单词的一部分。 ?在这种情况下,这应该工作:

\ba[^.,?;!]{1,50}(\Bth|[^t]h|[^h])e\b

答案 1 :(得分:0)

如果我理解正确,那就是你需要的正则表达式

\ba[\w ]+?(?<!\bth)e\b
  • [\w ]匹配所有单词字符和空格。如果您想要将短语与逗号和句点匹配,请更改此项。
  • +?是一个懒惰的量词。这意味着如果前面的字符串与下一个子模式不匹配,它将只保持匹配。
  • (?<!\bth)是负面的背后隐藏,以确保th之前没有e