积极看起来头 - 重复的措辞

时间:2014-05-07 21:21:01

标签: regex vb.net

我只是练习我的正则表达式所以没有真正的“问题”。我不想建议其他.NET方法可以做到这一点。这都是关于我学习的,所以如果它与正则表达式无关,请不要回答。谢谢。

我给了我自己匹配重复单词的任务。我对这个单词做了很难的编码,但问我自己,如果我们想要所有的话。我试图做的是将第一个单词的第一个单词引用到第一个单词并从那里开始。一整夜都在苦苦挣扎。

一个示例文字格式是“快速的棕色狐狸跳过布朗围栏”。我们可以看到The和Brown重复了两次。

表达式:

(?i)(?<=\s*\1\.*)\s+(\w+)

我出错的任何提示或建议都很棒。我得到了正则表达的伙伴,但仍在努力奋斗。我正在使用VB.Net

2 个答案:

答案 0 :(得分:1)

你在代码中使用的不是&#34;正面预测&#34;,它是&#34;看后面&#34;。

我没有使用vb.net的经验。但并非所有正则表达式引擎都支持动态长度(如.*

然而,你的问题可以通过积极的预测来解决:

(\b\w+\b)(?=.*?\1)

我没有Windows,只需尝试使用grep的-P(PCRE)和-i(忽略大小写)选项:

kent$ echo "The quick Brown Fox Jump over the Brown fence."|grep -iPo '(\b\w+\b)(?=.*?\1)'  
The
Brown

答案 1 :(得分:0)

你拥有的实际上是一个后视,而不是一个前瞻。您的方法可能仍然有效,但是,在.NET中,后引用(\1)需要引用的组之后。它还有助于使用单词边界(\b),而不是测试单词字符周围的空格(\s)。

乍一看,似乎你可以通过将捕获组放在后视中来解决这个问题:

(?i)(?<=\b(\w+)\b.*)\1

虽然由于后视内部的贪婪.*,第一组只会匹配字符串中的第一个单词(The)。所以这实际上等同于(?i)\b(\w+)\b.*\1。使其非贪婪(.*?)将使其仅匹配同一个单词的两个连续实例。

然后解决方案是简单地使用这样的预测:

(?i)\b(\w+)\b(?=.*\1)

并且无论出于什么原因你需要来获得第二个单词而不是第一个单词,这可以通过简单地在预见中放入第二个捕获组来实现

进一步阅读