c++ - 将两个正则表达式结果连接到一个输出字段中,但一次只能有一个

标签 c++ regex boost-regex

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

<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>(From username): .

最佳答案

Boost 似乎支持 branch reset .所以你可以使用类似的东西:

^(?|<([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

关于c++ - 将两个正则表达式结果连接到一个输出字段中,但一次只能有一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15559987/

相关文章:

c++ - Gtk+ 空地文件

c++ - 编程在人工智能中的应用

C++模板类类型实例化

javascript - 去除除文本和特定属性值之外的 HTML

c++ - 如何使用boost C++解析8位十六进制数和字符串?

c++ - 如何检查哪个匹配组被用来匹配(boost-regex)

c++ - 如何编写正则表达式来匹配 ((11 3) (96 15) (2 3) )

来自 ifstream 的 C++ 字符串数组

regex - htaccess - 如何比较环境变量 - 检查 2 个环境变量是否相同

java - 使用 String 的 ReplaceAll 方法删除所有标记,除非它们遵循特定短语