我试图根据给定的模式解析文件名但不能完善匹配。这是一个示例文件名:
#
以下是我的要求:
直到字符#
文件名可以包含任何内容,在_
之后,我必须找到字符-
或字符_
来分隔字符串。字符之间的字符串(可选-
或#
- 但不包括两者)可以包含任何其他字符。所以最终在角色_
之后,我必须将三(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");
它不会工作。
任何帮助将不胜感激。谢谢:))
答案 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"); }
}