匹配 Android 中的正则表达式
Matching regular expressions in Android
我想从这样的字符串中提取特定信息:
String content = "ObjectValue(Name1) ObjectValue(Name2) ObjectValue(Name3)";
我想使用正则表达式来仅提取:
Name1 Name2 Name3
但我无法成功。这是我的代码:
private static final String OBJECT_VALUE = "ObjectValue";
String content = "ObjectValue(Name1) ObjectValue(Name2) ObjectValue(Name3)";
String patternString = OBJECT_VALUE+"\((.+)\)";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(content);
if(matcher.find()) {
for (int i = 0; i < matcher.groupCount(); i++) {
Log.d("Found items", matcher.group(i));
}
}
这是输出:
Found items: ObjectValue(Name1) ObjectValue(Name2) ObjectValue(Name3)
所以,首先,我只想提取名称,而我显然在正则表达式中遗漏了一些东西。其次,我想要组的不同元素,而在输出中,组由单个元素组成,这可能吗?
提前致谢!
您需要使用非贪婪正则表达式 并且 使用 while
仅获取第 1 组值:
String content = "ObjectValue(Name1) ObjectValue(Name2) ObjectValue(Name3)";
String patternString = OBJECT_VALUE+"\(([^()]+)\)";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(content);
while(matcher.find()) {
Log.d("Found item:", matcher.group(1));
}
图案详情:
\(
- 文字 (
([^()]+)
- 第 1 组匹配除 (
和 )
以外的 1+ 个字符(使用 matcher.group(1)
访问的字符)
\)
- 文字 )
注意if
变成了while
,不需要循环matcher.groupCount()
因为我们知道需要的值在第1组
为了详细说明 Wiktor 的回答,这里有两个问题。
首先是,对于输入字符串"ObjectValue(Name1) ObjectValue(Name2) ObjectValue(Name3)"
和模式ObjectValue\((.+)\)
,.+
可以匹配"Name1) ObjectValue(Name2) ObjectValue(Name3"
。
第二个是matcher.group(0)
行为有点奇怪。来自文档:
Group zero denotes the entire pattern, so the expression m.group(0) is equivalent to m.group()
我想从这样的字符串中提取特定信息:
String content = "ObjectValue(Name1) ObjectValue(Name2) ObjectValue(Name3)";
我想使用正则表达式来仅提取:
Name1 Name2 Name3
但我无法成功。这是我的代码:
private static final String OBJECT_VALUE = "ObjectValue";
String content = "ObjectValue(Name1) ObjectValue(Name2) ObjectValue(Name3)";
String patternString = OBJECT_VALUE+"\((.+)\)";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(content);
if(matcher.find()) {
for (int i = 0; i < matcher.groupCount(); i++) {
Log.d("Found items", matcher.group(i));
}
}
这是输出:
Found items: ObjectValue(Name1) ObjectValue(Name2) ObjectValue(Name3)
所以,首先,我只想提取名称,而我显然在正则表达式中遗漏了一些东西。其次,我想要组的不同元素,而在输出中,组由单个元素组成,这可能吗?
提前致谢!
您需要使用非贪婪正则表达式 并且 使用 while
仅获取第 1 组值:
String content = "ObjectValue(Name1) ObjectValue(Name2) ObjectValue(Name3)";
String patternString = OBJECT_VALUE+"\(([^()]+)\)";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(content);
while(matcher.find()) {
Log.d("Found item:", matcher.group(1));
}
图案详情:
\(
- 文字(
([^()]+)
- 第 1 组匹配除(
和)
以外的 1+ 个字符(使用matcher.group(1)
访问的字符)\)
- 文字)
注意if
变成了while
,不需要循环matcher.groupCount()
因为我们知道需要的值在第1组
为了详细说明 Wiktor 的回答,这里有两个问题。
首先是,对于输入字符串"ObjectValue(Name1) ObjectValue(Name2) ObjectValue(Name3)"
和模式ObjectValue\((.+)\)
,.+
可以匹配"Name1) ObjectValue(Name2) ObjectValue(Name3"
。
第二个是matcher.group(0)
行为有点奇怪。来自文档:
Group zero denotes the entire pattern, so the expression m.group(0) is equivalent to m.group()