1

我正在解析聊天输出以获取用户名。这可能是输出的样子:

<Darker> MC_BOT sethome
(From Darker): MC_BOT exit

我需要匹配用户名和字符串中的命令内容。从两个字符串中获取这些数据很容易:

^(<([A-Za-z0-9_]+)>|\\(From ([A-Za-z0-9_]+)\\):) MC_BOT ([a-z]+)( [a-zA-Z0-9 ]+)?$
  |<Darker>         |(From Darker):                     |sethome

问题是,<Darker>输出字段 2 被使用,但(From Darker)解析器使用字段 3。

<Darker> MC_BOT command parameters
   1: <Darker>
   2: Darker  - field 2!
   3: 
   4: command
   5:  parameters


(From Darker): MC_BOT command parameters
   1: (From Darker):
   2: 
   3: Darker  - field 3!
   4: command
   5: parameters   

那么我应该如何编写这个正则表达式以使其在同一字段中包含用户名?另外,我可以让正则表达式忽略(...|...)吗?我只需要匹配用户名,而不是<username>or (From username):

4

1 回答 1

4

Boost 似乎支持分支重置。所以你可以使用类似的东西:

^(?|<([A-Za-z0-9_]+)>|\(From ([A-Za-z0-9_]+)\):) MC_BOT ([a-z]+)( [a-zA-Z0-9 ]+)?$
 ^   ^                       ^                          ^       ^
 |    \ group 1               \ also group 1             \ g.2   \ group 3
 |
 \ branch reset
于 2013-03-21T23:30:16.617 回答