2012-08-12 66 views
0

我一直在试图想出一个正则表达式,将从给定文本过滤出所有有效的UNIX路径,但不会匹配任何URL(如http://...正则表达式查找UNIX路径,而不是网址

下面的路径都是有效的:

/home/username/some_file.txt 
/home/username/some_file.longext 
"/path/to/file/some file.longext" 

但它不应该与任何这些:

http://www.somelink.com 
ftp://www.somelink.co.uk 
https://www.somelink.com and so on 

我想出了这一点,但它的所有URL匹配过,这是我很TR英滤除:

"?[a-zA-Z0-9\/].*\.[a-zA-Z0-9].*"? 

编辑: 我要提到的输入文本实际内容是从里面的URL,以及有效的UNIX路径的文件,因此正则表达式需要能匹配任何路径上的任何地方内除了匹配网址之外的文字。

+2

'[A-ZA-Z0-9]'是不够的,符合UNIX路径 - 你不能在POSIX路径中使用的唯一字符是'/'和空字符。 – 2012-08-12 18:14:09

+0

答案在这里:http://stackoverflow.com/questions/537772/what-is-the-most-correct-regular-expression-for-a-unix-file-path那么你不希望找到是什么这里:http://tools.ietf.org/html/rfc3986#appendix-B所以你需要检查第一件事,然后丢弃网址。 – N4553R 2012-08-12 18:15:30

+0

我也看看这个问题,但接受的正则表达式没有为给定文本我必须在 – strange 2012-08-12 18:25:35

回答

0

这似乎试图在字符串的开头匹配斜线简单,假设你的路径是绝对的,没有必要检查是否存在路径,它是可读或相似。它应该从^"?/开始。这将足以过滤URL。

+0

但是,这不匹配文件名中的空格,并且与此不匹配,例如: /Users/Me/Desktop/Path/SomeMore/Screen shot 2011 -03-15 at 20.38.21.png – strange 2012-08-12 18:24:43

+0

这是正则表达式的开始。 – Birei 2012-08-12 18:29:47

2

你应该知道,你拿出任何解决方案仅是一个启发式的。

cd /tmp 
mkdir test 
cd test 
mkdir http: 
cd http: 
mkdir www.google.com 
cd www.google.com 
echo "I'm a file, not a web site" > 'search?q=Unix+path+syntax+double+slash' 
cd /tmp/test 

现在http://www.google.com/search?q=Unix+path+syntax+double+slash既是:一个URL和文件的路径:

cat 'http://www.google.com/search?q=Unix+path+syntax+double+slash' 
w3m 'http://www.google.com/search?q=Unix+path+syntax+double+slash' 

知道什么是一个路径名,究竟是不是一个路径名的唯一可靠的方法是通过上下文。 cat的一个参数是一个路径名。 w3m的一个参数不是。在自由形式的文本中,没有解析作者的母语,你就是猜测。

+0

实际上'w3m'的一个参数有时候是一个路径名。它做了一些猜测。我在原始答案中使用了'wget'而不是'w3m',但Google禁止了'wget',所以我立即改变了它,并最终导致了这个混乱。 – 2012-08-12 19:42:26

+0

这是所有罚款的家伙,我没事启发式,因为我知道这个文件将日志文件和他们不可能指的实际上是假冒的URL地址路径名。我只需要正则表达式就可以区分这两者。总之,我需要正则表达式来过滤掉任何以http/ftp/https等开头的路径。 – strange 2012-08-12 21:39:49