2017-10-16 849 views
0

我有这样的数据正则表达式查找字符串的最后一次出现在URL

|-> http://www.example.com/fr/page-name (09:00:13) 
|-> http://www.example.com/fr/page-name (09:00:19) 
|-> http://www.example.com/fr/page-name (09:01:41) 
|-> http://www.example.com/en/page-name (09:02:29) 

,我需要从列表中最后一个网址,以获取(fr|en)。在这种情况下,'en'

我使用.Net和我已经试过了负向前看符号,我认为是找到en|fr它不是后面en|fr

/(en|fr)/(?!/(en|fr)/) 

/(en|fr)/(?!.*?/(en|fr)/) 

,但我失去了一些东西,因为它的所有URL匹配。

任何帮助表示赞赏。

+0

为什么你不反转你正在查找的字符串和你正在测试的字符串,并搜索第一次出现的字符串? – mikeb

+0

这看起来像一个日志文件;每个网址都是自己的行吗?为什么不把最后一行解析出来呢?我们可能需要更多的上下文来解决您正在尝试解决的更大问题。 – hunteke

+0

不确定正则表达式是这份工作最好的(甚至是非常好的)工具。 –

回答

2

试试这个正则表达式:

[^$]+\/(en|fr)\/

Click for Demo

说明:

  • [^$]+ - 匹配1次出现的任何字符不是end-of-the-string。基本上,我们刚刚达到使用整个文本块的结束这
  • \/(en|fr)\/ - 它将会匹配任何enfr月1日发生的/从字符串的结尾包围(由于回溯)

或者,您可以简单地写入\/(en|fr)(?=\/.*$)并关闭多行标志。

所需值存在于组1中的匹配。

+0

非常感谢,这完美的作品。 –

+1

如果它解决了您的问题,请不要忘记接受答案 – Gurman

0

正则表达式非常适合匹配字符串模式,但在某些情况下,它可能是矫枉过正。既然你可以将字符串转换为一个URI,然后得到URI的第一部分,我会用这条路线走:

'Placeholder variable for For/Each 
Dim u As Uri 

'Iterate through each URL 
For Each url As String In urls.Split({Environment.NewLine}, StringSplitOptions.None) 
    'Split the current line by the space character, get the second item, and convert it into a URI 
    u = New Uri(url.Split(" "c)(1)) 

    'Print the language which is the second segment of the URI 
    Console.WriteLine(u.Segments(1)) 
Next 

小提琴:Live Demo

+0

谢谢,但正如我所说的,我受到应用程序使用正则表达式的限制。 –

相关问题