正则表达式:如何在没有更多捕获组的情况下使用 'or'?
Regular expressions: how to use 'or' without more capturing groups?
我们应该只将正则表达式添加到脚本中而不涉及任何其他内容。该脚本的制作使其接受 3 个捕获组,并且有 2 个不同的正则表达式取决于输出。我为这两种情况准备了表达式,但是当我这样做时:
expression1 | expression2
脚本认为有 6 个捕获组(每个表达式包含 3 个捕获组),因此给我一个错误。
我应该如何在没有脚本认为有 6 个捕获组的情况下加入 2 个表达式,因为永远不能应用两个表达式,它是表达式 1 或表达式 2,但不能同时应用。
表达式 1 是:
([a-zA-Z0-9]+[ ]?)\(P[: ]?([a-zA-Z0-9 ]*)()
表达式 2 是:
()()\)[ ]+([a-zA-Z0-9]+$|[a-zA-Z0-9]+[ ])
感谢您的任何建议!
编辑:post 更新后,因为第 1 组和第 2 组在第二个表达式中是空的,第 3 组在第一个表达式中是空的,所以它们应该与 non-capturing 组组合,只需删除空的群组:
(?:([a-zA-Z0-9]+[ ]?)\(P[: ]?([a-zA-Z0-9 ]*)|\)[ ]+([a-zA-Z0-9]+$|[a-zA-Z0-9]+[ ]))
最后一组([a-zA-Z0-9]+$|[a-zA-Z0-9]+[ ])
也可以缩短
([a-zA-Z0-9]+(?:$|[ ]))
Non-capturing groups (?:
.. )
可用于代替 (
.. )
,以在不添加新组的情况下对模式进行分组。
如果没有关于 expression1 和 expression2 的更多信息,很难回答假设模式具有以下形式:
exp1: (g11)s11(g21)s21(g31)
exp2: (g12)s12(g22)s22(g32)
组合表达式可以是
(?=(?:g11)s11(?:g21)s21(?:g31)|(?:g12)s12(?:g22)s22(?:g32))((?:g11|g12))(?:s11|s12)((?:g21|g22))(?:s21|s22)((?:g31|g32))
但可能会根据需要进行简化。
您有 2 个正常的备选方案和几个不好的备选方案:
第一次正常。通过代码分开:
if (expression1) {
DO SOMETHING
} else if (expression2) {
DO SOMETHING
} else {
NO MATCH FOR BOTH
}
第二次正常。使用所有 6 个口袋。
if (arMatches[1] or arMatches[2] or arMatches[3]) {
DO SOMETHING
} else if (arMatches[4] or arMatches[5] or arMatches[6]) {
DO SOMETHING
} else {
NO MATCH FOR BOTH
}
对于糟糕的解决方案,您可以使用非常复杂的正则表达式,这可能会有一些隐藏的错误,并且这种表达式将非常难以维护,可能根本不可能。
我们应该只将正则表达式添加到脚本中而不涉及任何其他内容。该脚本的制作使其接受 3 个捕获组,并且有 2 个不同的正则表达式取决于输出。我为这两种情况准备了表达式,但是当我这样做时:
expression1 | expression2
脚本认为有 6 个捕获组(每个表达式包含 3 个捕获组),因此给我一个错误。
我应该如何在没有脚本认为有 6 个捕获组的情况下加入 2 个表达式,因为永远不能应用两个表达式,它是表达式 1 或表达式 2,但不能同时应用。
表达式 1 是:
([a-zA-Z0-9]+[ ]?)\(P[: ]?([a-zA-Z0-9 ]*)()
表达式 2 是:
()()\)[ ]+([a-zA-Z0-9]+$|[a-zA-Z0-9]+[ ])
感谢您的任何建议!
编辑:post 更新后,因为第 1 组和第 2 组在第二个表达式中是空的,第 3 组在第一个表达式中是空的,所以它们应该与 non-capturing 组组合,只需删除空的群组:
(?:([a-zA-Z0-9]+[ ]?)\(P[: ]?([a-zA-Z0-9 ]*)|\)[ ]+([a-zA-Z0-9]+$|[a-zA-Z0-9]+[ ]))
最后一组([a-zA-Z0-9]+$|[a-zA-Z0-9]+[ ])
也可以缩短
([a-zA-Z0-9]+(?:$|[ ]))
Non-capturing groups (?:
.. )
可用于代替 (
.. )
,以在不添加新组的情况下对模式进行分组。
如果没有关于 expression1 和 expression2 的更多信息,很难回答假设模式具有以下形式:
exp1: (g11)s11(g21)s21(g31)
exp2: (g12)s12(g22)s22(g32)
组合表达式可以是
(?=(?:g11)s11(?:g21)s21(?:g31)|(?:g12)s12(?:g22)s22(?:g32))((?:g11|g12))(?:s11|s12)((?:g21|g22))(?:s21|s22)((?:g31|g32))
但可能会根据需要进行简化。
您有 2 个正常的备选方案和几个不好的备选方案:
第一次正常。通过代码分开:
if (expression1) {
DO SOMETHING
} else if (expression2) {
DO SOMETHING
} else {
NO MATCH FOR BOTH
}
第二次正常。使用所有 6 个口袋。
if (arMatches[1] or arMatches[2] or arMatches[3]) {
DO SOMETHING
} else if (arMatches[4] or arMatches[5] or arMatches[6]) {
DO SOMETHING
} else {
NO MATCH FOR BOTH
}
对于糟糕的解决方案,您可以使用非常复杂的正则表达式,这可能会有一些隐藏的错误,并且这种表达式将非常难以维护,可能根本不可能。