Regex 将多个组分配给关键字的正则表达式
我正在尝试实现一个正则表达式,它能够将相同的关键字或关键字组合分配给一个或多个命名组 例如,我想匹配'aa'和'bb'或'cc',并将'aa'和'bb'分配给组,将'cc'分配给组 此外,我可以有一个类似“aa”和“bb”或“aa”的查询,我希望“aa”和“bb”在组中,同时“aa”在组中 编辑:Regex 将多个组分配给关键字的正则表达式,regex,regex-group,Regex,Regex Group,我正在尝试实现一个正则表达式,它能够将相同的关键字或关键字组合分配给一个或多个命名组 例如,我想匹配'aa'和'bb'或'cc',并将'aa'和'bb'分配给组,将'cc'分配给组 此外,我可以有一个类似“aa”和“bb”或“aa”的查询,我希望“aa”和“bb”在组中,同时“aa”在组中 编辑: Input Example : bb is nice but not without the missingaa Output : Does not Validate, Group<1>
Input Example : bb is nice but not without the missingaa
Output : Does not Validate, Group<1> is null | Group<2> is null
-
-
-
我知道分组可能很复杂,但我希望在aa和bb存在的情况下,分组不为空
如何实现这种行为?作为参考,对于大多数正则表达式引擎,组匹配不会像数组一样累积。网络是一个例外,它可以做到这一点 对不起,你是对的,需要修改一下。 但是,您必须强制查找第一个或c。这是通过有条件的前瞻来完成的。 祝你好运
# ^.*?(?:(?:(?<grp1>(?:\baa\b.*?\bbb\b|\bbb\b.*?\baa\b))(?(?=.*\b(?:cc|aa)\b).*(?<grp2>(?:\bcc\b|\baa\b))|))|(?<grp2>\b(?:cc|aa)\b))
^
.*?
(?:
(?: # Force find a AND b, OR c
(?<grp1>
(?:
\b aa \b .*? \b bb \b
| \b bb \b .*? \b aa \b
)
)
(?(?= # conditional assertion, force to find
.*
\b (?: cc | aa ) \b
)
.*
(?<grp2>
\b (?: cc | aa ) \b
)
|
)
)
|
(?<grp2> # Else, forcc find OR c
\b (?: cc | aa ) \b
)
)
编辑:这将匹配aa cc,bb
但是要注意,排列越多,就越复杂。这会导致断言、标志和条件,所有这些都会降低性能,并使维护变得更加困难
# ^.*?(?:(?:(?<grp1>(?:\baa\b(?:(?!cc).)*?\bbb\b|\baa\b(?:(?!bb).)*?\bcc\b|\bbb\b(?:(?!cc).)*?\baa\b|\bbb\b(?:(?!aa).)*?\bcc\b))(?(?=.*\b(?:aa|bb|cc)\b).*(?<grp2>\b(?:aa|bb|cc)\b)|))|(?<grp2>\b(?:cc|aa)\b))
^
.*?
(?:
# Force find: (aa bb), (cc)
# (aa cc), (bb)
# (bb aa), (cc)
# (bb cc), (aa)
(?:
(?<grp1> # GROUP1
(?:
\b aa \b (?:(?!cc).)*? \b bb \b
|
\b aa \b (?:(?!bb).)*? \b cc \b
|
\b bb \b (?:(?!cc).)*? \b aa \b
|
\b bb \b (?:(?!aa).)*? \b cc \b
)
)
(?(?= # Conditional assertion, find (aa), (bb), (cc)
.*
\b (?: aa | bb | cc ) \b
)
# The condition is true, so consume it
.*
(?<grp2> # GROUP2
\b (?: aa | bb | cc ) \b
)
| # The condition is false, match nothing
)
)
|
# Or,
# Force find: (), (aa)
# (), (bb)
# (), (cc)
(?<grp2> # GROUP2
\b (?: aa | bb | cc ) \b
)
)
你能举一个输入和期望输出的例子吗?问题是输入imo。第一组应该匹配什么?第二组什么时候匹配?您使用的引擎允许组名的第一个字符使用数字,,我使用的是.NET C 4.0/4.5,数字并不重要。我还可以使用特定字符串将信息存储在命名组中。我目前正在尝试使用反向引用,但没有成功。yetHello,感谢您的回复。事实上,我正在使用.NET,但我不认为我需要递归正则表达式。请你检查一下我提供的例子好吗?你能告诉我你是否找到了比这个更好的解决方案吗:?aa.*bb | bb.*aa |?cc,因为我想添加可能更多的成员,感谢第一组中的2位。此外,如果我这样做?aa.*bb | bb.*aa |?aa bb组上的aa将包含aa bb,但组中不会包含aa,这对我来说非常重要。谢谢您的编辑。这是工作的情况下,如aa-bb-cc很好。现在正则表达式的复杂性之一是,我可以有bb aa,因此它要求我对aa和bb都使用前缀?=这一事实。目前无法捕获bb aa。另外,通过将cc替换为aa?*\baa\b.*\bbb\b???.*\b?:aa\b,aa bb仅在中被捕获,而不是两者都被捕获。@user2465083-请参阅“Edit2”。应该不需要?=除非你想变得更花哨,否则可以使用类似aa.*bb | bb.*aa的替换。先试试简单的东西,得到一个工作模型。再次感谢你花这么多时间帮助我。很抱歉,您提供的正则表达式与我尝试的任何字符串aa bb、aa bb cc、cc…上的任何内容都不匹配。。。。我已经能够得到我期望的行为:?aabb |?bbaa |?aa和输入aabb aa,但是我无法用任何字符来分隔aa-bb。在本例中,有2个匹配项。第一个有?=aabb和?=空值和一秒,带?=空和?=aa
Input Example : bb is nice but not without the missingaa or cc
Output : Validate, Group<1> is null | Group<2> is cc
Input Example : bb is nice as well as aa or cc
Output : Validate, Group<1> is bb is nice as well as aa | Group<2> is cc
# ^.*?(?:(?:(?<grp1>(?:\baa\b.*?\bbb\b|\bbb\b.*?\baa\b))(?(?=.*\b(?:cc|aa)\b).*(?<grp2>(?:\bcc\b|\baa\b))|))|(?<grp2>\b(?:cc|aa)\b))
^
.*?
(?:
(?: # Force find a AND b, OR c
(?<grp1>
(?:
\b aa \b .*? \b bb \b
| \b bb \b .*? \b aa \b
)
)
(?(?= # conditional assertion, force to find
.*
\b (?: cc | aa ) \b
)
.*
(?<grp2>
\b (?: cc | aa ) \b
)
|
)
)
|
(?<grp2> # Else, forcc find OR c
\b (?: cc | aa ) \b
)
)
# ^.*?(?:(?:(?<grp1>(?:\baa\b(?:(?!cc).)*?\bbb\b|\baa\b(?:(?!bb).)*?\bcc\b|\bbb\b(?:(?!cc).)*?\baa\b|\bbb\b(?:(?!aa).)*?\bcc\b))(?(?=.*\b(?:aa|bb|cc)\b).*(?<grp2>\b(?:aa|bb|cc)\b)|))|(?<grp2>\b(?:cc|aa)\b))
^
.*?
(?:
# Force find: (aa bb), (cc)
# (aa cc), (bb)
# (bb aa), (cc)
# (bb cc), (aa)
(?:
(?<grp1> # GROUP1
(?:
\b aa \b (?:(?!cc).)*? \b bb \b
|
\b aa \b (?:(?!bb).)*? \b cc \b
|
\b bb \b (?:(?!cc).)*? \b aa \b
|
\b bb \b (?:(?!aa).)*? \b cc \b
)
)
(?(?= # Conditional assertion, find (aa), (bb), (cc)
.*
\b (?: aa | bb | cc ) \b
)
# The condition is true, so consume it
.*
(?<grp2> # GROUP2
\b (?: aa | bb | cc ) \b
)
| # The condition is false, match nothing
)
)
|
# Or,
# Force find: (), (aa)
# (), (bb)
# (), (cc)
(?<grp2> # GROUP2
\b (?: aa | bb | cc ) \b
)
)