gpt4 book ai didi

java - Java 中的正则表达式环视构造 : advise on optimization needed

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:49:15 24 4
gpt4 key购买 nike

我正在尝试在以逗号分隔的列表中搜索文件名:

text.txt,temp_doc.doc,template.tmpl,empty.zip

我使用 Java 的正则表达式实现。输出要求如下:

  1. 只显示文件名而不显示它们各自的扩展名
  2. 排除以“temp_”开头的文件

它应该是这样的:

text

template

empty

到目前为止,我已经设法编写了或多或少令人满意的正则表达式来应对第一个任务:

[^\\.,]++(?=\\.[^,]*+,?+)

我认为要使其符合第二个要求,最好的选择是使用环视结构,但不确定如何编写可靠且优化的表达式。虽然以下正则表达式似乎确实满足了要求,但如果没有其他原因,它显然是一个有缺陷的解决方案,因为它依赖于明确的最大文件名长度。

(?!temp_|emp_|mp_|p_|_)(?<!temp_\\w{0,50})[^\\.,]++(?=\\.[^,]*+,?+)

附言我研究正则表达式才几天,所以请不要 mock 这种新手式的过于复杂的代码:)

最佳答案

  • Display only filenames and not their respective extensions
  • Exclude files that begin with "temp_"

一种变体是这样的:

(?:^|,)(?!temp_)((?:(?!\.[^.]*(?:,|$)).)+)

这允许

  • 不以“单词字符”开头的文件名(Tim Pietzcker 的解决方案不是)
  • 包含点的文件名(例如 file.name.ext 将匹配为 file.name)

但实际上,这真的很复杂。您最好编写一个小函数,在逗号处拆分输入并从各部分中去除扩展名。

无论如何,这是拆解:

(?:^|,)        # filename start: either start of the string or comma(?!temp_)      # negative look-ahead: disallow filenames starting with "temp_"(              # match group 1 (will contain your file name)  (?:          #   non-capturing group (matches one allowed character)    (?!        #     negative look-ahead (not followed by):      \.       #       a dot      [^.]*    #       any number of non-dots (this matches the extension)      (?:,|$)  #       filename-end (either end of string or comma)    )          #     end negative look-ahead    .          #     this character is valid, match it  )+           #   end non-capturing group, repeat)              # end group 1

http://rubular.com/r/4jeHhsDuJG

关于java - Java 中的正则表达式环视构造 : advise on optimization needed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11817249/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com