gpt4 book ai didi

java - 正则表达式在Java中解析文件名

转载 作者:行者123 更新时间:2023-11-30 02:57:41 25 4
gpt4 key购买 nike

我试图根据给定的模式解析文件名,但无法完美匹配。以下是示例文件名:

CRS-ISAU-RPV#3430_Dedalus_Conc.ok.erto_AOTreviglio.doc

这是我的要求:

直到字符#文件名可以包含任何内容,在#之后,我必须找到字符_或字符 - 分隔字符串。字符之间的字符串(可选 _- - 但不能同时包含两者)可以包含任何其他字符。因此,最终在字符 # 之后,我必须恰好组合三 (3) 个 _- 字符。该字符串应以 .doc.docx.odt 结尾,但不能以 .ok.doc 结尾>.ok.docx.ok.odt

这是我尝试过的:

(.*)#([^_-]+)[_-]([^_-]+)[_-]([^_-]+)[_-]([^_-]+)\.[doc|odt|docx].*(?<!\.ok)$

但这迫使我以 .doc.ok.docs.ok.docx.ok 结束字符串,实际上我希望保留最后的文件扩展名。

如果我尝试这个:

(.*)#([^_-]+)[_-]([^_-]+)[_-]([^_-]+)[_-]([^_-]+)\..*(?<!ok\.[doc|odt|docx])$

它不会工作。

如有任何帮助,我们将不胜感激。谢谢:)

最佳答案

看来你可以使用

^([^#]*#[^-_]*)[-_](.*)$(?<=(?<!\.ok)\.(?:docx?|odt)$)

说明:

  • ^ - 字符串开头(与 .matches() 一起使用时不需要,但无害)
  • ([^#]*#[^-_]*) - 第 1 组:除 # 之外的任何 0+ 个字符( [^#]* ) 后跟 #然后是 - 之外的任何 0+ 个字符和_ (与 [-_] )
  • (.*)$ - 匹配除换行符之外的 0 个以上字符(因为未指定 DOTALL 模式)直到字符串末尾但是...
  • (?<=(?<!\.ok)\.(?:docx?|odt)$) - 到达终点后,检查是否有.doc.docx.odt在末尾(参见 (?<=\.(?:docx?|odt)$) ),前面没有 .ok (参见(?<!\.ok))。在PCRE中,这些条件应该被分割,Java正则表达式似乎可以处理lookbehind内部的交替。

基于前瞻的替代方案:

^([^#]*#[^-_]*)[-_](?=.*(?<!\.ok)\.(?:docx?|odt)$)(.*)$

请参阅regex101 demo 。它是相同的,但所有字符串结尾检查都是在匹配 - 后完成的。或_ .

请参阅Java demo :

List<String> strs = Arrays.asList("CRS-ISAU-RPV#3430_Dedalus_Conc.ok.erto_AOTreviglio.doc",
"CRS-ISAU-RPV#3430_Dedalus_Conc.ok.erto_AOTreviglio.docx",
"CRS-ISAU-RPV#3430_Dedalus_Conc.ok.erto_AOTreviglio.odt",
"CRS-ISAU-RPV#3430_Dedalus_Conc.ok.erto_AOTreviglio.ok.docx",
"CRS-ISAU-RPV#3430_Dedalus_Conc.ok.erto_AOTreviglio.ok.odt"
);
for (String str : strs) {
System.out.println("----------\nMatching: " + str);
Matcher m = Pattern.compile("^([^#]*#[^-_]*)([-_])(.*)$(?<=(?<![.]ok)[.](?:docx?|odt)$)").matcher(str);
if (m.matches()) {
System.out.println(m.group(1));
System.out.println(m.group(2));
System.out.println(m.group(3));
} else { System.out.println("No match"); }
}

关于java - 正则表达式在Java中解析文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36791442/

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