我在查找如何使用JAVA中的正则表达式获取字符串的某个部分时遇到了麻烦。这是我的输入字符串:
application.APPLICATION NAME.123456789.status
我需要抓住名为"APPLICATION NAME"
的字符串部分。我不能简单地分析期间字符,因为APPLICATION NAME
本身可能包含一个句号。第一个单词"application
"将始终保持不变,"APPLICATION NAME"
后的字符将始终为数字。
我能够分开期间并抓住第一个指数,但正如我所提到的,APPLICATION NAME
本身可能包含句号,所以这不好。我也能够抓住一个时期的第一个和倒数第二个指数,但这似乎是无效的,并且希望通过使用REGEX来面向未来。
我已经搜索了好几个小时,并且找不到多少指导。谢谢!
答案 0 :(得分:1)
您可以将^application\.(.*)\.\d
与find()
一起使用,或将application\.(.*)\.\d.*
与matches()
一起使用。
使用find()
的示例代码:
private static void test(String input) {
String regex = "^application\\.(.*)\\.\\d";
Matcher m = Pattern.compile(regex).matcher(input);
if (m.find())
System.out.println(input + ": Found \"" + m.group(1) + "\"");
else
System.out.println(input + ": **NOT FOUND**");
}
public static void main(String[] args) {
test("application.APPLICATION NAME.123456789.status");
test("application.Other.App.Name.123456789.status");
test("application.App 55 name.123456789.status");
test("application.App.55.name.123456789.status");
test("bad input");
}
输出
application.APPLICATION NAME.123456789.status: Found "APPLICATION NAME"
application.Other.App.Name.123456789.status: Found "Other.App.Name"
application.App 55 name.123456789.status: Found "App 55 name"
application.App.55.name.123456789.status: Found "App.55.name"
bad input: **NOT FOUND**
只要" status"不以数字开头。
答案 1 :(得分:0)
使用split()
,您可以将key.split("\\.")
保存在String[] s
中,然后再从s[1]
加入s[s.length-3]
。
使用正则表达式,您可以:
String appName = key.replaceAll("application\\.(.*)\\.\\d+\\.\\w+")", "$1");
答案 2 :(得分:0)
为何分裂?只是:
String appName = input.replaceAll(".*?\\.(.*)\\.\\d+\\..*", "$1");
这也正确地处理应用程序名称中的点然后数字,但只有在您知道输入是预期格式的情况下才能正常工作。
处理"坏"如果模式不匹配则返回空白输入,更严格并使用一个总是匹配(替换)整个输入的可选项:
String appName = input.replaceAll("^application\\.(.*)\\.\\d+\\.\\w+$|.*", "$1");