正则表达式占用太多字符

时间:2018-01-18 13:41:04

标签: regex vb.net

我需要一些帮助来构建我的正则表达式。

我要做的是将文本的特定部分与固定单词之间的不可预测部分相匹配。一个例子是回复电子邮件时得到的句子:

草书部分是可变的,可能包含空格,或者新行可能从这一点开始。

为了得到这个,我建立了我的正则表达式:在[\ s \ S] +?在[\ s \ S] +?人[\ s \ S] +?写了:

基本上,[\ s \ S] +?应该填写任何字母,数字,空格或中断/新行,因为我无法预测固定单词之间可能存在什么,我相信它将永远存在。

现在是困难的部分,当我要添加“#34; On"在我想要匹配的句子上面的文本中的某个地方,正则表达式现在匹配比我想要的更大的文本。这是由于使用了[\ s \ S] +。

如何使我的正则表达式匹配尽可能少的字符?使用"?"在" +"之前让它变得懒惰也无济于事。

这里的例子是单词" From - This - Point - Everything:"。案件被忽略。

正确:https://regexr.com/3jdek
错误是因为添加了"来自":https://regexr.com/3jdfc

正则表达式将在VB.NET中使用

在这里可以找到带有html标签的更真实的生活。在这里,我避免使用[\ s \ S] +?或(。+)?(\ r)?(\ n)?(。+?)

正确:https://regexr.com/3jdd1
在上面的文本中添加了正则表达式的某些部分后,错误:https://regexr.com/3jdfu。虽然,在HTML中,几乎不可能发生,因为用户永远不会自己编写匹配的标签,我确实想确保我的正则表达式是正确的以防万一

这些事情是肯定的:我知道文本的部分是什么开始的,无论在整个文本的哪个部分,我都知道文本的部分结束了,并且有特定的固定词可能使正则表达式更多可靠,但可以省略。搜索部分下方的任何文本也可以匹配,但上面没有任何文本可以匹配

另一个出错的例子:https://regexr.com/3jdli。基本上,我在本文中没有那么多,所以正则表达式使用的令牌较少。只添加第一个<已经使正则表达式占用太多。

根据我自己的经验,在确保我不使用任何[\ s \ S] +时,大多数问题都可以避免?在我做一个(\ r)之前?(\ n)?第一

1 个答案:

答案 0 :(得分:0)

[\s\S]匹配所有字符,因为两个互补集的并集,它就像.,带有特殊选项/s(点匹配换行符)。默认情况下,正则表达式是贪婪的,因此将返回最大匹配。

正确的链接之后,最短匹配之后的令牌必须是geschreven,所以另一种不使用延迟扩展的写入方式,更灵活的是预先添加重复的字符集通过循环内部的负向前瞻,

所以

<blockquote type="cite" [^>]+?>[^O]+?Op[^h]+?heeft(.+?(?=geschreven))geschreven:

变为

<blockquote type="cite" [^>]+?>[^O]+?Op[^h]+?heeft((?:(?!geschreven).)+)geschreven:
  • (?: )用于非捕获仅封装负向前瞻的组和.(可由[\s\S]替换)
  • (?! )里面是负向前瞻,它确保当前位置在下一个字符不是结束令牌的开头之前。

以下评论可以明确提及重复序列中不应出现的内容:

From(?:(?!this)[\s\S])+this(?:(?!point)[\s\S])+point(?:(?!everything)[\s\S])+everything:

From(?:(?!From|this)[\s\S])+this(?:(?!point)[\s\S])+point(?:(?!everything)[\s\S])+everything:

From(?:(?!From|this)[\s\S])+this(?:(?!this|point)[\s\S])+point(?:(?!everything)[\s\S])+everything:

了解技术(?:(?!tokens)[\s\S])+的作用。

    第一个this中的
  • 无法显示在Fromthis之间
  • 第二个Fromthis中的
  • 无法显示在Fromthis之间
  • 第三个thispoint中的
  • 无法显示在thispoint之间 等