通过捕获简化正则表达式匹配组

时间:2015-11-09 20:41:58

标签: php regex preg-match regex-lookarounds regex-greedy

我正在尝试匹配此类字符串(5种不同的字符串)。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>parent</artifactId>
        <groupId>org.example</groupId>
        <version>1.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>child</artifactId>

    <repositories>
        <repository>
            <id>Artifactory-Releases</id>
            <url>http://artifactory:8081/artifactory/dev</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
            <releases>
                <enabled>true</enabled>
            </releases>
        </repository>
        <repository>
            <id>Artifactory-Snapshots</id>
            <url>http://artifactory:8081/artifactory/dev</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
            <releases>
                <enabled>false</enabled>
            </releases>
        </repository>
    </repositories>
</project>

n在哪里是可变的,但是其他的零是常数,n也不能是零。

我需要获得这样的结果,因为我使用替代运算符https://regex101.com/r/vE9hL4/1

进行了硬编码

我需要捕获'|中的所有数字|”就像我的正则表达式一样。 请帮助简化它。

2 个答案:

答案 0 :(得分:2)

首先,我做匹配;由管道字符包围的一个或多个正数,可选地后跟由管道字符包围的零。

if (preg_match_all($re, $subject, $matches)) {
    $numbers = preg_split('/\|/', $matches[1][0], -1, PREG_SPLIT_NO_EMPTY);
}

如果匹配,您可以根据管道字符本身进行拆分:

{{1}}

答案 1 :(得分:1)

抱歉没有看过部分问题,这是我修改后的答案......

^\|([0-9]*)\|(?:\|(0)\|\|(0)\|\|(0)\|\|(0)\||(?:\|([1-9]*)\|\|(0)\|\|(0)\|\|(0)\|)|(?:\|([1-9]*)\|\|([1-9]*)\|\|(0)\|\|(0)\|)|(?:\|([1-9]*)\|\|([1-9]*)\|\|([1-9]*)\|\|(0)\|)|(?:\|([1-9]*)\|\|([1-9]*)\|\|([1-9]*)\|\|([1-9]*)\|)|)$

https://regex101.com/r/mW5bN4/1