我正在尝试从最后一个下划线获取文件的名称,直到结束。
例如,
ABC_AA.xml
应为ABC
和
ABC_AASD_AD_AA.xml
应为ABC_AASD_AD
我正在考虑使用非贪婪的^
符号。
我试过这个:
String nameToSearch = testName.replaceAll("_(^(_).)+\\.xml$", "");
答案 0 :(得分:6)
如何使用简单的子串而不是正则表达式
String nameToSearch = testName.substring(0, testName.lastIndexOf('_'));
或者如果没有_
则可以使用
String noSuffix = testName.substring(0, testName.lastIndexOf('.'));//remove ".xml"
String nameToSearch = noSuffix.substring(0, testName.lastIndexOf('_'));
但是如果你真的想使用正则表达式,那么你可以试试
testName.replaceAll("_[^_]*[.]xml$", "");
将匹配(并移除)_
,其中包含零个或多个非_
个字符[^_]*
,并以.xml
结尾。
如果没有_
,您可以使用
_[^_]*
testName.replaceAll("(_[^_]*)?[.]xml$", "");
答案 1 :(得分:3)
简单。
使用组和反向引用,如下:
String input = "ABC_AASD_AD_AA.xml";
// | using replaceAll to pass regex
// | | group 1: one or more characters, greedy
// | | | underscore
// | | || one or more characters, reluctant
// | | || | escaped dot and extension
// | | || | | back-reference to group 1
System.out.println(input.replaceAll("(.+)_.+?\\.xml", "$1"));
<强>输出强>
ABC_AASD_AD
注意强>
任何不符合Pattern
的输入都将被退回。
答案 2 :(得分:1)
我相信这个正则表达式应该有效:
String repl = str.replaceFirst("_[^_]+$", "");
答案 3 :(得分:1)
^
字符可以用作“独占”,即排除某些字符仅作为[]
内字符类的第一个字符。 [^_]
匹配任何不是下划线的字符。在方括号之外,它表示“源字符串的开头”。
所以你很亲密。试试这个:
String nameToSearch = testName.replaceAll("_[^_]+\\.xml$", "");
或者,如果您想在下划线中处理文件名结尾(即将ABC_.XML
更改为ABC
),并在这种情况下删除下划线,请更改{{1 (1或更多)到+
(0或更多)。