Regex 将字符串与PCRE中的多个模式匹配

Regex 将字符串与PCRE中的多个模式匹配,regex,pcre,Regex,Pcre,如何在PCRE中将一个字符串与多个模式匹配?我需要匹配这个字符串 subj1 = "9112345678 put car details of the car"; patt1 = "(\\d+) ([a-z]+) ([a-z]+) (.+)"; 有时,主题可能是这样的 subj2 = "9112345678 put car"; 哪个是匹配模式 patt2 = "(\\d+) ([a-z]+) ([a-z]+)"; 由于受试者是动态的,并且不知道,因此先前的一位受试者希望“或”这两种模式,

如何在PCRE中将一个字符串与多个模式匹配?我需要匹配这个字符串

subj1 = "9112345678 put car details of the car";

patt1 = "(\\d+) ([a-z]+) ([a-z]+) (.+)";
有时,主题可能是这样的

subj2 = "9112345678 put car";
哪个是匹配模式

patt2 = "(\\d+) ([a-z]+) ([a-z]+)";
由于受试者是动态的,并且不知道,因此先前的一位受试者希望“或”这两种模式,并希望将受试者与复合模式相匹配。 比如 子匹配(patt1或patt2)
我们可以在PCRE中这样做吗

您只需将最后一个区块设置为可选:

(\\d+) ([a-z]+) ([a-z]+)( (.+))?
如果您还需要允许“9112345678 put”,请添加更多可选组:

(\\d+) ([a-z]+)( ([a-z]+)( (.+))?)?
如果您希望对捕获组保持良好的顺序引用,并且如果您的PCRE引擎确实是PC,则可以使用以下内容代替某些捕获组:

(\\d+) ([a-z]+)(?: ([a-z]+)(?: (.+))?)?
感谢Kobi好心地推荐此变体。使用此版本,与以下内容匹配:

9112345678 put car details of the car
将产生:

  • “9112345678”
    中的
    $1
  • 将“
    放入
    $2
  • “car”
    中的
    $3
  • 中的“汽车详细信息”
    $4

这可能比考虑所有额外的嵌套更容易处理。

您可以使用or运算符
|
。类似于
([a-z]+)|([1-9]+)

感谢mu的回复,基本上我的详细问题是字符串也可以是“9112345678 put”,这就是为什么我想使用多个模式和/或它们。@Ravikumar:然后像我的更新一样添加更多可选部分。你应该在问题中包含这一点。+1,但是有一点忽略了OP的捕获组-
(\\d+)([a-z]+)(?:([a-z]+)(?:(.+)?)(?:(.+))?
)可能会更好地处理OP的现有代码。@Kobi:很公平,但事实上我发现很多扩展正则表达式语法有点嘈杂。我将在中编辑该版本作为更新。谢谢。谢谢kobi,他帮了很多忙。我正是在寻找这个。谢谢keith,问题是我有一组模式,我们怎么办?或者“多个模式组”?你可以(将它们组合起来)(多个)|(多个组)|(或ed在一起)。:-)这就像你的“(patt1或patt2)的直译。这就是or(|)运算符的作用。