Regex 将字符串与PCRE中的多个模式匹配
如何在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]+)"; 由于受试者是动态的,并且不知道,因此先前的一位受试者希望“或”这两种模式,
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(|)运算符的作用。