正则表达式用Java解析文件名

时间:2016-04-22 10:35:02

标签: java regex

我试图根据给定的模式解析文件名但不能完善匹配。这是一个示例文件名:

#

以下是我的要求:

直到字符#文件名可以包含任何内容,在_之后,我必须找到字符-或字符_来分隔字符串。字符之间的字符串(可选-# - 但不包括两者)可以包含任何其他字符。所以最终在角色_之后,我必须将三(3)个-.doc个字符组合在一起。该字符串应以.docx.odt.ok.doc但不是.ok.docx.ok.odt(.*)#([^_-]+)[_-]([^_-]+)[_-]([^_-]+)[_-]([^_-]+)\.[doc|odt|docx].*(?<!\.ok)$ 结尾。

这是我试过的:

.doc.ok

但这迫使我以.docs.ok.docx.ok(.*)#([^_-]+)[_-]([^_-]+)[_-]([^_-]+)[_-]([^_-]+)\..*(?<!ok\.[doc|odt|docx])$ 结束字符串,实际上我想在结尾处保留文件扩展名。

如果我试试这个:

string mystring = "Lines xmlns:a=\"http://schemas.microsoft.com/2003/10/Serialization/Arrays\";
string tobeReplaced = "Lines xmlns:a=\"http://schemas.microsoft.com/2003/10/Serialization/Arrays\";
var newString = mystring.Replace(tobeReplaced, "Lines");

它不会工作。

任何帮助将不胜感激。谢谢:))

1 个答案:

答案 0 :(得分:2)

似乎你可以使用

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

说明:

  • ^ - 字符串的开头(与.matches()一起使用时不需要,但无害)
  • ([^#]*#[^-_]*) - 第1组:#以外的任何0+字符([^#]*)后跟#,然后是-以外的任何0 +字符和_(与[-_]
  • (.*)$ - 匹配除换行符以外的0+个字符(因为未指定DOTALL模式)直到字符串BUT结束...
  • (?<=(?<!\.ok)\.(?:docx?|odt)$) - 在结束后,检查最后是否.doc.docx.odt(参见(?<=\.(?:docx?|odt)$))使用.ok(请参阅(?<!\.ok))。在PCRE中,这些条件应该是分开的,Java正则表达式似乎可以应对外观背后的变化。

基于先行的替代方案

^([^#]*#[^-_]*)[-_](?=.*(?<!\.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"); }
}