2

我在 Sscala 中解析文本并使用正则表达式:

val imageLink = "(http?:\\/\\/.*\\.(?:png|jpg|gif|bmp|jpeg))".r.findAllIn(postText).toList
val htmlLink = "http(s)?://([\\w+?\\.\\w+])+([a-zA-Z0-9\\~\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*)?"
            .r.findAllIn(postText).toList.filterNot(s => s.contains("jpg") || s.contains("jpeg")
              || s.contains("png") || s.contains("gif") || s.contains("bmp"))

但我不想使用所有这些 s.contains。我想在正则表达式中找到不以 jpg、bmp 等结尾的 http 链接。

谢谢

4

1 回答 1

4

这个想法是使用否定的前瞻(?!)表达式:

"(?!.*(?:jpg|jpeg|png|gif|bmp))http(s)?://([\\w+?\\.\\w+])+([a-zA-Z0-9\\~\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*)?"

您也可以省略http(s)?->中的括号,https?因为在这两种情况下?都只适用于s字符。

正则表达式的进一步改进将是在 URL 中可能出现的确切位置检查扩展名。

于 2013-05-01T08:05:37.553 回答