以下划线开头但不包含任何下划线的正则表达式

时间:2014-03-21 17:09:19

标签: java javascript regex

我正在尝试从最后一个下划线获取文件的名称,直到结束。

例如, ABC_AA.xml应为ABCABC_AASD_AD_AA.xml应为ABC_AASD_AD

我正在考虑使用非贪婪的^符号。 我试过这个:

String nameToSearch = testName.replaceAll("_(^(_).)+\\.xml$", "");

4 个答案:

答案 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或更多)。