要检查的正则表达式以 [ 开始并以 ] 结束
Regex to check with starts with [ and end with ]
我在这样的文件中有一些文本:
[ABM-100]
0x00,Hours
0x01,Minutes
0x06,T2
[CO2SMO]
1 ,Instrument
2 ,Time
3 ,AAI
我想获取 [ 和 ] 之间的文本,例如 ABM-100 和 CO2SMO。
我尝试使用正则表达式匹配,但结果是
[ABM-100]
0x00,Hours
0x01,Minutes
0x06,T2
[CO2SMO]
我尝试了以下方法
line.matches("^\[.*.\]$")
您不需要为此使用正则表达式,因为您只需 line.startsWith("[") && line.endsWith("]");
即可,而且速度会快得多。
.*
是贪心的,这意味着您的正则表达式将尝试匹配它找到的第一个 [
和 ]
之间的最大可能范围。您可以尝试通过添加 ?
如 .*?
让 .*
不情愿。也可以把.
换成[^\]]
,避免匹配里面的]
。
同时 matches
检查整个字符串是否匹配正则表达式,return 不匹配。我怀疑您可能想使用
Pattern p = Pattern.compile(yourRegex);
Matcher m = p.matcher(text);
while(m.find()){
String match = m.group();
//do what you want with match like:
System.out.println(match);
}
您没有显示完整代码,但代码 line.matches("^\[.*.\]$")
暗示您正在分别检查每一行。
如果要捕获匹配文本的一部分,则应使用捕获组。
由于您使用的是 matches()
,因此不需要锚点 (^$
),额外的 .
是多余的。
这显示了如何操作:
String[] lines = { "[ABM-100]",
"0x00,Hours ",
"0x01,Minutes ",
"0x06,T2 ",
"",
"[CO2SMO]",
"1 ,Instrument",
"2 ,Time ",
"3 ,AAI " };
Pattern p = Pattern.compile("\[(.*)\]");
for (String line : lines) {
Matcher m = p.matcher(line);
if (m.matches())
System.out.println(m.group(1));
}
输出
ABM-100
CO2SMO
如果line
不是一次代表一行,而是代表整个文本,则需要使用find()
,并使^$
锚点匹配开头和结尾通过指定 MULTILINE
标志行:
String text = "[ABM-100]\n" +
"0x00,Hours \n" +
"0x01,Minutes \n" +
"0x06,T2 \n" +
"\n" +
"[CO2SMO]\n" +
"1 ,Instrument\n" +
"2 ,Time \n" +
"3 ,AAI \n";
Pattern p = Pattern.compile("^\[(.*)\]$", Pattern.MULTILINE);
Matcher m = p.matcher(text);
while (m.find())
System.out.println(m.group(1));
输出相同。
我在这样的文件中有一些文本:
[ABM-100]
0x00,Hours
0x01,Minutes
0x06,T2
[CO2SMO]
1 ,Instrument
2 ,Time
3 ,AAI
我想获取 [ 和 ] 之间的文本,例如 ABM-100 和 CO2SMO。 我尝试使用正则表达式匹配,但结果是
[ABM-100]
0x00,Hours
0x01,Minutes
0x06,T2
[CO2SMO]
我尝试了以下方法
line.matches("^\[.*.\]$")
您不需要为此使用正则表达式,因为您只需 line.startsWith("[") && line.endsWith("]");
即可,而且速度会快得多。
.*
是贪心的,这意味着您的正则表达式将尝试匹配它找到的第一个 [
和 ]
之间的最大可能范围。您可以尝试通过添加 ?
如 .*?
让 .*
不情愿。也可以把.
换成[^\]]
,避免匹配里面的]
。
同时 matches
检查整个字符串是否匹配正则表达式,return 不匹配。我怀疑您可能想使用
Pattern p = Pattern.compile(yourRegex);
Matcher m = p.matcher(text);
while(m.find()){
String match = m.group();
//do what you want with match like:
System.out.println(match);
}
您没有显示完整代码,但代码 line.matches("^\[.*.\]$")
暗示您正在分别检查每一行。
如果要捕获匹配文本的一部分,则应使用捕获组。
由于您使用的是 matches()
,因此不需要锚点 (^$
),额外的 .
是多余的。
这显示了如何操作:
String[] lines = { "[ABM-100]",
"0x00,Hours ",
"0x01,Minutes ",
"0x06,T2 ",
"",
"[CO2SMO]",
"1 ,Instrument",
"2 ,Time ",
"3 ,AAI " };
Pattern p = Pattern.compile("\[(.*)\]");
for (String line : lines) {
Matcher m = p.matcher(line);
if (m.matches())
System.out.println(m.group(1));
}
输出
ABM-100
CO2SMO
如果line
不是一次代表一行,而是代表整个文本,则需要使用find()
,并使^$
锚点匹配开头和结尾通过指定 MULTILINE
标志行:
String text = "[ABM-100]\n" +
"0x00,Hours \n" +
"0x01,Minutes \n" +
"0x06,T2 \n" +
"\n" +
"[CO2SMO]\n" +
"1 ,Instrument\n" +
"2 ,Time \n" +
"3 ,AAI \n";
Pattern p = Pattern.compile("^\[(.*)\]$", Pattern.MULTILINE);
Matcher m = p.matcher(text);
while (m.find())
System.out.println(m.group(1));
输出相同。