【发布时间】:2012-08-02 18:32:58
【问题描述】:
我正在尝试在以下位置的逗号分隔列表中搜索文件名:
text.txt,temp_doc.doc,template.tmpl,empty.zip
我使用 Java 的正则表达式实现。输出要求如下:
- 只显示文件名而不是它们各自的扩展名
- 排除以“temp_”开头的文件
应该是这样的:
文字
模板
空
到目前为止,我已经设法编写了或多或少令人满意的正则表达式来处理第一个任务:
[^\\.,]++(?=\\.[^,]*+,?+)
我认为使其符合第二个要求的最佳选择是使用环视构造,但不确定如何编写可靠和优化的表达式。虽然以下正则表达式似乎确实可以满足要求,但如果没有其他原因,它显然是一个有缺陷的解决方案,它依赖于显式的最大文件名长度。
(?!temp_|emp_|mp_|p_|_)(?<!temp_\\w{0,50})[^\\.,]++(?=\\.[^,]*+,?+)
附:我研究正则表达式才几天,所以请不要嘲笑这种新手式的过于复杂的代码:)
【问题讨论】:
-
您的文件名规则是什么?文件名中允许使用逗号,那么这些会发生吗?在 CSV 文件中,如果用引号括起来,这些都是合法的。
-
旁注:点在字符类中没有特殊含义。你不能在那里逃脱它。这个
[^\\.,]实际上会禁止点、逗号和退格 - 这将是一个错误。 -
@Tomalak - 请注意还有
\\w,这表明它来自Java 字符串。在这种情况下,"[^\\.,]"与/[^\.,]/相同,因此将忽略反斜杠。我知道,小细节,但至少没有错误:)仍然 - 好的评论,大多数人都搞错了,一个反斜杠是没用的。 -
@Kobi 你就在这里,但这没什么可依赖的,尤其是在经常切换正则表达式方言时。因为“它恰好可以工作” 或“无论如何都无所谓” 而草率地转义是许多软件漏洞的原因。始终了解环境的哪个部分需要何种级别的逃逸至关重要。
-
@Tomalak - 我同意!每个人都是赢家!
标签: java regex lookahead negative-lookahead