Java 如何使这个正则表达式变短?
我写了这个正则表达式:Java 如何使这个正则表达式变短?,java,regex,Java,Regex,我写了这个正则表达式: \\s+(?:([^:]+):)(?:([^:]+):)(?:([^:]+):)(?:([^:]+):) 要分析这些内容: lvt:vgt:mwi ao:44.00m::lvt\U mlog:100.00: lvt2:vgt2:-wi-a-:908.00m: 及 1组为:lvt 第2组:vgt ... 4组:44.00m 我不想把它缩短 我试着这样做:\\s+(?:([^:]+):)+ 但在这种情况下,它只捕获最后一组 结果将是: 1组:44.00m在Java中,不能将
\\s+(?:([^:]+):)(?:([^:]+):)(?:([^:]+):)(?:([^:]+):)
要分析这些内容:
lvt:vgt:mwi ao:44.00m::lvt\U mlog:100.00:
lvt2:vgt2:-wi-a-:908.00m:
及
1组为:lvt
第2组:vgt
...
4组:44.00m
我不想把它缩短
我试着这样做:\\s+(?:([^:]+):)+
但在这种情况下,它只捕获最后一组
结果将是:
1组:44.00m在Java中,不能将多个匹配项捕获到一个组中,即不能使用
(?:([^:]+):)+
将lvt
、vgt
等一次性收集到一个组中
您可以将文本拆分为单独的行,如果您知道始终有4个组,则调用find()
,然后使用以下表达式连续调用group(0)
4次:[^:::+
。这将在4次呼叫中捕获lvt
、vgt
、mwi ao
和44.00m
某些伪代码(未经测试,因此可能包含拼写错误:):
Pattern p=Pattern.compile([^::+]);
字符串输入=。。。;
字符串[]行=输入。拆分(\\s”);
用于(字符串行:行){
//请注意,对于上述简单情况,您也可以按“:”进行拆分
匹配器m=p.匹配器(线);
列表元素=新的LinkedList();
while(m.find()){
元素。添加(m组(0));
}
//从列表中获取前4个元素
//如果列表中少于4,则表示该行不匹配
}
编辑:我更新了答案,以匹配编辑后的问题,该问题似乎用冒号(
:
)分隔了我的空白和字段。在Java中,你不能在一个组中捕获多个匹配项,即不能使用(?:([^::+):+
来收集lvt
,vgt
等,一次完成一组
您可以将文本拆分为单独的行,如果您知道始终有4个组,则调用find()
,然后使用以下表达式连续调用group(0)
4次:[^:::+
。这将在4次呼叫中捕获lvt
、vgt
、mwi ao
和44.00m
某些伪代码(未经测试,因此可能包含拼写错误:):
Pattern p=Pattern.compile([^::+]);
字符串输入=。。。;
字符串[]行=输入。拆分(\\s”);
用于(字符串行:行){
//请注意,对于上述简单情况,您也可以按“:”进行拆分
匹配器m=p.匹配器(线);
列表元素=新的LinkedList();
while(m.find()){
元素。添加(m组(0));
}
//从列表中获取前4个元素
//如果列表中少于4,则表示该行不匹配
}
编辑:我更新了答案,以匹配编辑后的问题,该问题似乎用冒号(
:
)分隔了我的空白和字段。您可以删除许多不必要的非捕获括号:
\\s+([^:]+):([^:]+):([^:]+):([^:]+):
您可以删除许多不必要的非捕获括号:
\\s+([^:]+):([^:]+):([^:]+):([^:]+):
如果要查找“:”之间的值,可以使用String.split(regex) 如果您方便的话,它将比group regex快。。。这是你能找到的最短的正则表达式 禁止编辑错误注释
添加组 如果规则的“
:”,则可以找到如下组:
for(int i = 0, n = result.length; i < n; i+= 6) {
final String group1 = result[i];
final String group2 =result[i+1];
...
}
for(int i=0,n=result.length;i
否则请在
期间使用,并在最后一个空字段后重新启动到group1。如果要查找“:”之间的值,可以使用String.split(regex)
import java.util.regex.Pattern;
import java.util.regex.Matcher;
class RegexTest{
public static void main(String[] args){
Pattern pat= Pattern.compile("\\s(([^:]+):){3}([^:]+)");
Matcher mat= pat.matcher(" lvt:vgt:mwi-ao:44.00m::::lvt_mlog:100.00: lvt2:vgt2:-wi-a-:908.00m::::::");
while(mat.find()){
System.console().format("group: %s , start: %d , end: %d\\n",
mat.group(), mat.start(), mat.end());
}
}
}
如果您方便的话,它将比group regex快。。。这是你能找到的最短的正则表达式
禁止编辑错误注释
添加组
如果规则的“:”,则可以找到如下组:
for(int i = 0, n = result.length; i < n; i+= 6) {
final String group1 = result[i];
final String group2 =result[i+1];
...
}
for(int i=0,n=result.length;i
否则,在使用的同时使用,并在最后一个空字段后重新启动到group1
import java.util.regex.Pattern;
import java.util.regex.Matcher;
class RegexTest{
public static void main(String[] args){
Pattern pat= Pattern.compile("\\s(([^:]+):){3}([^:]+)");
Matcher mat= pat.matcher(" lvt:vgt:mwi-ao:44.00m::::lvt_mlog:100.00: lvt2:vgt2:-wi-a-:908.00m::::::");
while(mat.find()){
System.console().format("group: %s , start: %d , end: %d\\n",
mat.group(), mat.start(), mat.end());
}
}
}
组:lvt:vgt:mwi ao:44.00m,起点:0,终点:22
组别:lvt2:vgt2:-wi-a-:908.00m,起点:42,终点:67
然后可以按“:”拆分组
组:lvt:vgt:mwi ao:44.00m,起点:0,终点:22
组别:lvt2:vgt2:-wi-a-:908.00m,起点:42,终点:67
然后,您可以按“:”拆分组。您使用的是.match()
还是.find()
?如果文本中没有要匹配的:
,为什么组中有:
?除此之外,如果您想捕获4个组中的每一个组,那么在Java中没有办法缩短该表达式。我粘贴了不正确的文本。您使用的是.match()
还是.find()
?如果文本中没有要匹配的:
,为什么组中会有:
?除此之外,如果您想捕获4个组中的每一个组,那么在Java中没有办法缩短该表达式。我粘贴了不正确的文本。请注意,除非要匹配的文本以空格开头,否则使用\\s+
将不匹配lvt
等。您可能需要使用(?:^\\s+)
相反。@Thomas:你说得对——但他的正则表达式似乎已经开始工作了,他只是想把它缩短一些。而且,\s*
可以代替(?:^ | \\s+
。看起来是这样,也许他一开始就有空格。顺便说一句,您可以通过删除最后一个冒号使其更短:)请注意,除非要匹配的文本以空格开头,否则使用\\s+
将不会匹配lvt
等。您可能希望改为使用(?:^\\\s+
。@Thomas:您是对的-但他的正则表达式似乎已经在工作,他只是想把它更短。而且,\s*
可以代替(?:^ | \\s+
。看起来是这样,也许他一开始就有空格。顺便说一句,你可以通过删除最后一个co使其更短