Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使这个正则表达式变短?_Java_Regex - Fatal编程技术网

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使其更短